home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 125 < prev    next >
Text File  |  1995-12-01  |  116KB  |  3,110 lines

  1. C.S.M.P. Digest             Thu, 30 Nov 95       Volume 3 : Issue 125
  2.  
  3. Today's Topics:
  4.  
  5.         Best Balloon Utility??
  6.         COMPONENTS don't seem to work in DRIVERS (Apple, why?)
  7.         Can't lock directory using HSetFLock?
  8.         Game Network Model
  9.         Help How to draw Japanese Text by GX.
  10.         Hierarchical Menus in Apple Menu
  11.         How do I patch SFGetFile (or packages in general)
  12.         How do you get to use the utility backdrop as used by find file?
  13.         Mac Texture Mapping code needed
  14.         OpenDoc is here (for the Mac!!!
  15.         Pixel doubling speed note!
  16.         Std Template Library Book
  17.         VBL Syncing Solution and problems.
  18.         Where to put temp files?
  19.         [Q] Volume type information available?
  20.         [Q] _PrimeTime crashes?
  21.  
  22.  
  23.  
  24. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  25. (pottier@clipper.ens.fr).
  26.  
  27. The digest is a collection of article threads from the internet
  28. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  29. csmp.games. It is designed for people who read news semi-regularly and
  30. want an archive of the discussions.  If you don't know what a
  31. newsgroup is, you probably don't have access to it. Ask your systems
  32. administrator(s) for details. If you don't have access to news, you
  33. may still be able to post messages to the group by using a mail server
  34. like anon.penet.fi (mail help@anon.penet.fi for more information).
  35.  
  36. Each issue of the digest contains one or more sets of articles (called
  37. threads), with each set corresponding to a 'discussion' of a particular
  38. subject.  The articles are not edited; all articles included in this digest
  39. are in their original posted form (as received by our news server at
  40. nef.ens.fr).  Article threads are not added to the digest until the last
  41. article added to the thread is at least two weeks old (this is to ensure that
  42. the thread is dead before adding it to the digest).  Article threads that
  43. consist of only one message are generally not included in the digest.
  44.  
  45. The digest is officially distributed by two means, by email and ftp.
  46.  
  47. If you want to receive the digest by mail, send email to listserv@ens.fr
  48. with no subject and one of the following commands as body:
  49.     help                                Sends you a summary of commands
  50.     subscribe csmp-digest Your Name     Adds you to the mailing list
  51.     signoff csmp-digest                 Removes you from the list
  52. Once you have subscribed, you will automatically receive each new
  53. issue as it is created.
  54.  
  55. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  56. Questions related to the ftp site should be directed to
  57. scott.silver@dartmouth.edu.
  58.  
  59. -------------------------------------------------------
  60.  
  61. >From hellstrm@jaguNET.com (Ben Hellstrom)
  62. Subject: Best Balloon Utility??
  63. Date: Thu, 09 Nov 1995 08:32:46 -0500
  64. Organization: jaguNET Access Services
  65.  
  66. Any opinions on the "best" balloon creation/editing utilities??
  67.  
  68. -- 
  69. Ben Hellstrom
  70. hellstrm@jaguNET.com
  71.  
  72. +++++++++++++++++++++++++++
  73.  
  74. >From hsoi@tamu.edu (John C. Daub)
  75. Date: Mon, 13 Nov 1995 12:37:55 -0600
  76. Organization: Texas A&M University
  77.  
  78. In article <hellstrm-0911950832460001@brian.jagunet.com>,
  79. hellstrm@jaguNET.com (Ben Hellstrom) wrote:
  80.  
  81. > Any opinions on the "best" balloon creation/editing utilities??
  82.  
  83. well, if i remember right, there are a bunch of options...
  84.  
  85. I think there is a dedicated application out there to help write Ballons,
  86. I thin, it's called BallonWriter or something, but i can't remember.
  87.  
  88. Also, Resourcer works nicely (from what I hear) at helping to write balloons,
  89. and I even think that SC++'s Visual Architect can do Balloons.
  90.  
  91. Then, if you have CodeWarrior 7, Peter Lewis wrote a plug-in compiler for
  92. CW7 (won't work with anything less) that does balloon help compiling.  I
  93. haven't used it yet, but I've looked it over and it seems pretty straight
  94. forward and easy (tho I've not really had the chance yet to evaluate it)
  95. and only $20 shareware.  You can get this from any Peter Lewis ftp site.
  96.  
  97. hope that helps!
  98.  
  99. -- 
  100. * John C. Daub, aka Hsoi    | mailto:hsoi@tamu.edu                         *
  101. * Grad Student, Lab Manager | WWW URL: http://http.tamu.edu:8000/~jcd7106/ *
  102. * Self-proclaimed Mac Guru  | Department of Speech Communication           *
  103. * Will program for food.    | Texas A&M University, USA                    *
  104. * "Your future is whatever you make it, so make it a good one" - Doc       *
  105.  
  106. +++++++++++++++++++++++++++
  107.  
  108. >From peter@stairways.com.au (Peter N Lewis)
  109. Date: Thu, 16 Nov 1995 17:10:02 +0800
  110. Organization: Stairways Software
  111.  
  112. In article <hellstrm-0911950832460001@brian.jagunet.com>,
  113. hellstrm@jaguNET.com (Ben Hellstrom) wrote:
  114.  
  115. >Any opinions on the "best" balloon creation/editing utilities??
  116.  
  117. Resourcerer or my Balloon Help Compiler plugin for Metrowerks
  118. CodeWarrior.  There isn't really any other choices except Rez or ResEdit
  119. (there is a completely broken program from Apple called Balloon Writer
  120. which hopefully is no longer on the price list).
  121.  
  122. Enjoy,
  123.    Peter.
  124. -- 
  125. Web: <http://www.share.com/peterlewis/>
  126. FTP: <ftp://ftp.share.com/pub/peterlewis/>
  127. Email: <mailto:peter@stairways.com.au>
  128.  
  129. ---------------------------
  130.  
  131. >From ËÕ†ÖØâåæf (Steven T. Roussey)
  132. Subject: COMPONENTS don't seem to work in DRIVERS (Apple, why?)
  133. Date: 10 Nov 1995 15:48:46 GMT
  134. Organization: University of California, Irvine
  135.  
  136. I've spent way too much time trying to figure this one out. Any help is
  137.  
  138. *greatly* appreciated.
  139.  
  140. I'm writing a device driver that uses a component and the component
  141. manager to do the actual transfers of data. In my driver I save the A4
  142. world so I can use it in my callbacks. I also create and save a
  143. componentInstance in the Open call. The A4 world and the
  144. componentInstance are the same value across calls to the driver (I
  145. check inside and manually in the debugger).
  146.  
  147. The component manager chokes and says the componentInstance is not
  148. valid across calls to the driver. That is, it works in the Open call,
  149. but when I use it in Prime, Close etc it doesn't work. Same value, same
  150. A4, and I never close the instance.
  151.  
  152. It does kinda work if I Open and Close the instance in every call, but
  153. that is way to much overhead. And I'm scared of having to do this in
  154. every callback.
  155.  
  156. What's going on here? Is there something about the Device Manager the
  157. screws up the Component Manager? Please help. Thanks.
  158.  
  159. -steve-
  160.  
  161.  
  162.                                 ---------------------------------------
  163.                                 |           Steven T. Roussey         |
  164.                                 |     mailto:sroussey@eng.uci.edu     |
  165.                                 |  http://www.eng.uci.edu/~sroussey/  |
  166.                                 ---------------------------------------
  167.  
  168. +++++++++++++++++++++++++++
  169.  
  170. >From Matt Slot <fprefect@umich.edu>
  171. Date: 12 Nov 1995 01:05:18 GMT
  172. Organization: University of Michigan
  173.  
  174.  > The component manager chokes and says the componentInstance is not
  175.  > valid across calls to the driver. That is, it works in the Open call,
  176.  > but when I use it in Prime, Close etc it doesn't work. Same value, same
  177.  > A4, and I never close the instance.
  178.  > 
  179.  > [...]
  180.  > 
  181.  > What's going on here? Is there something about the Device Manager the
  182.  > screws up the Component Manager? Please help. Thanks.
  183.  
  184. When you register and open a component, the Component Manager ties that
  185. component to the calling application. When you send the Open call, that
  186. app gets the component instance, and all others are disallowed.
  187.  
  188. What you need to do is register the component globally, so that your 
  189. driver can call the component from whichever context it comes in from.
  190. (You may also need to restore the home A5 world, but I don't have my
  191. reference at hand, so I don't know for sure.)
  192.  
  193. Good luck,
  194.  
  195. Matt
  196.  
  197. +++++++++++++++++++++++++++
  198.  
  199. >From ËÕ†ÖØâåæf (Steven T. Roussey)
  200. Date: 12 Nov 1995 18:10:59 GMT
  201. Organization: University of California, Irvine
  202.  
  203. > > When you register and open a component, the Component Manager ties that
  204. > component to the calling application. When you send the Open call, that
  205. > app gets the component instance, and all others are disallowed.
  206. > What you need to do is register the component globally, so that your 
  207. > driver can call the component from whichever context it comes in from.
  208.  
  209. Ahhh... Thanks!
  210.  
  211. OK, now two questions,
  212.  
  213. 1) Will making the Open call at boot time cause it to be global? (I'm
  214. not doing this right now, but I will have to soon anyhow).
  215.  
  216. 2) Just how do I register the component globally?
  217.  
  218. -steve-
  219.  
  220. +++++++++++++++++++++++++++
  221.  
  222. >From Matt Slot <fprefect@umich.edu>
  223. Date: 12 Nov 1995 23:55:32 GMT
  224. Organization: University of Michigan
  225.  
  226.  > 1) Will making the Open call at boot time cause it to be global? (I'm
  227.  > not doing this right now, but I will have to soon anyhow).
  228.  
  229. I don't know about that, since I have never tried. However, you should
  230. remember that the Component Mgr is built-in to System 7.1, but that for
  231. System 6.0x and 7.0x it is only loaded as part of QuickTime.  You will
  232. need to make arrangements to license it (its free!), and to load your
  233. components *after* QuickTime has loaded.
  234.  
  235.  > 2) Just how do I register the component globally?
  236.  
  237. Check out the documentation for the following functions, which are used
  238. to load and "register" the component resources before you "open" them:
  239. [From MPTA]
  240.  
  241.         pascal long RegisterComponentResourceFile(short resRefNum, short global);
  242.  
  243.         pascal Component RegisterComponent(ComponentDescription *cd, 
  244.                 ComponentRoutine componentEntryPoint, short global,
  245.                 Handle componentName, Handle componentInfo, Handle componentIcon);
  246.                 
  247.         Where global is a set of flags that control the scope of component
  248.         registration. You can use these flags to specify a value for the global
  249.         parameter:
  250.         
  251.         registerCmpGlobal = 1;
  252.                 Specify this flag to indicate that this component should be made
  253.                 available to other applications and clients as well as the one
  254.                 performing the registration. If you do not specify this flag,
  255.                 the component is available for use only by the registering
  256.                 application or component (that is, the component is local to the
  257.                 A5 world of the registering program).
  258.  
  259.         ...
  260.                 
  261.                 
  262. Enjoy,
  263. Matt
  264.  
  265. +++++++++++++++++++++++++++
  266.  
  267. >From zobkiw@datawatch.com (Joe Zobkiw)
  268. Date: Wed, 15 Nov 1995 13:31:19 -0500
  269. Organization: Datawatch Corporation
  270.  
  271. If you're writing a Component you should really be reading INSIDE
  272. MACINTOSH chapters on COMPONENTS for complete information. Guessing isn't
  273. going to help you.
  274.  
  275. ---------------------------
  276.  
  277. >From tbekiare@ux7.cso.uiuc.edu (Bekiares Tyrone Drew)
  278. Subject: Can't lock directory using HSetFLock?
  279. Date: 10 Nov 1995 05:55:25 GMT
  280. Organization: University of Illinois at Urbana
  281.  
  282. Okay, why won't this work?
  283.  
  284. I want to set the locked bit for a directory using HSetFlock...
  285.  
  286. here's my code:
  287.  
  288. vol_name = GetString(128);
  289.  
  290. if (vol_name != NULL) {
  291.         HLock((Handle)vol_name);
  292.         err = GetVRef (*vol_name, &vref);
  293.         err = FindFolder(kOnSystemDisk,'macs',0,&tvref,&ddir);
  294.  
  295.         pblock.dirInfo.ioNamePtr = filename;
  296.         pblock.dirInfo.ioVRefNum = vref;
  297.         pblock.dirInfo.ioFDirIndex = -1;
  298.         pblock.dirInfo.ioDrDirID = ddir;
  299.         err = PBGetCatInfo (&pblock, false);
  300.                                                                                                                 
  301.         err = HSetFLock(tvref,2,pblock.dirInfo.ioNamePtr);      
  302.         HUnlock((Handle)vol_name);
  303. }
  304.  
  305. The call to err = HSetFLock(tvref,2,pblock.dirInfo.ioNamePtr); always
  306. returns '-35' : no such volume, '-42' : file not found, and '-5000' afp
  307. access denied depending on what combination of params I give the call..
  308.  
  309. If I use
  310.  
  311. err = HSetFLock(tvref,ddir,pblock.dirInfo.ioNamePtr);
  312.  
  313. than I always get a '-43'...
  314.  
  315. if I use 2 (root directory) than I always get -35..
  316.  
  317. and I once got a -5000... can't remember how..
  318.  
  319. IM says you can use this call to lock directories, but dosen't specify
  320. how you should give the dirID and name accordingly..
  321.  
  322. thoughts?
  323.  
  324. Thanks!
  325. tb93@uiuc.edu
  326.  
  327.  
  328. +++++++++++++++++++++++++++
  329.  
  330. >From jumplong@aol.com (Jump Long)
  331. Date: 14 Nov 1995 04:33:13 -0500
  332. Organization: America Online, Inc. (1-800-827-6364)
  333.  
  334. Bekiares Tyrone Drew wrote:
  335. >I want to set the locked bit for a directory using HSetFlock...
  336. >
  337. >here's my code:
  338. (bunch of stuff omitted)
  339. >IM says you can use this call to lock directories, but dosen't
  340. >specify how you should give the dirID and name accordingly..
  341.  
  342. You can't lock folders on all volumes. To determine if a volume supports
  343. locking of folders, call PBHGetVolParms and check the bHasFolderLock
  344. volume attribute bit. If it's set, you can lock or unlock folders.
  345.  
  346. On local HFS volumes, the bHasFolderLock volume attribute bit is set only
  347. when the File Sharing server or AppleShare server is running. Remote
  348. AppleShare volumes always have the bHasFolderLock volume attribute bit
  349. set.
  350.  
  351. So, that's very likely the problem you're seeing.
  352.  
  353. The volume reference number, parent directory ID, and name you pass to
  354. HSetFLock should follow the standard File Manager rules. There's a nice
  355. table (Table 2-10) on page 2-35 of "Inside Macintosh: Files" that shows
  356. how the different combinations of vRefNum, dirID and fileName (or
  357. directoryName) are interpreted by the File Manager. You might also want to
  358. review the section "Identifying Files, Directories, and Volumes" that
  359. starts on page 2-23 of IM:Files.
  360.  
  361. - Jim Luther
  362.  
  363. ---------------------------
  364.  
  365. >From stay@park.uvsc.edu (Steve Taylor)
  366. Subject: Game Network Model
  367. Date: 4 Nov 1995 14:44:23 -0700
  368. Organization: Utah Valley State College, Orem, Utah
  369.  
  370.  
  371. Hi.  Networked games are basically my reason for living, and I've written
  372. several, but my current project is my first attempt at an arcade-speed
  373. networked game.
  374.  
  375. I'm having trouble figuring out how to get good performance out of
  376. appletalk for >2 players.  Using an existing library I had for
  377. using PPCToolbox, I built my basic game, and it worked great for
  378. two players.  But, as soon as I added a third player, the game
  379. became pretty jerky, running 15 frames or so before freezing for
  380. half a second and continuing.
  381.  
  382. I'm doing asynchronous reads and writes, (using polling for completion,
  383. not callback routines.  I'm scanning the keyboard instead of calling
  384. GetNextEvent, so my polling routines should get called pretty
  385. frequently with no long time between).  Also, this is a client-server
  386. model, with the app "hosting" the game creating a server port and
  387. its own client port, and with the other app joining the game with
  388. just a client port.
  389.  
  390. Presumably, the problem is that the server is happily reading and
  391. writing data to its own node and the other node with no problems,
  392. but when I add a third player, it can't send the data simultaneously,
  393. so one message getting written out has to wait for the other to
  394. finish, etc.?  This is assuming the message-to-self part is
  395. fast enough to have no effect.
  396.  
  397. Can anyone suggest a way for me to get a good smooth rate sending
  398. messages to multiple nodes?  In this case, the server is always
  399. sending identical data to the client nodes, if this helps.
  400.  
  401. Then, I wrote an ADSP class to replace the PPCToolbox class I was using,
  402. and the game's slower even in 2-player mode.  Maybe I just haven't
  403. done enough optimizing, but should using ADSP directly be faster than
  404. using PPCToolbox?
  405.  
  406. What protocol do games like Armor Alley use?  Even with 4 players, this
  407. game really cruises on a fast machine.  I know one player hosts a
  408. game, but underneath do they use a client-server model or some
  409. peer-to-peer model?
  410.  
  411. And, while we're on the subject, why can my application talk to itself
  412. with PPCToolbox but when I try to establish a connection to a
  413. connection listener in the same application with ADSP, I get an error?
  414. (I'm getting -1277, I think, but only on the side that requests the
  415. connection.  The connection listener thinks the connection attempt
  416. succeeded.  Sorry, it's been a few weeks since I played with this.)
  417. I am setting the SelfSend flag.
  418.  
  419. Thanks very much for any advice, and a belated "Wahoo!" for the creation
  420. of this group.
  421.  
  422.  
  423. -- 
  424. -- Steve Taylor (stay@wahoo.com  or  stay@park.uvsc.edu)
  425. --
  426. --  "Ha Ha," said Eeyore bitterly.  "Merriment and what-not.
  427. --  Don't apologize.  It's just what *would* happen."
  428.  
  429. +++++++++++++++++++++++++++
  430.  
  431. >From jmunkki@beta.hut.fi (Juri Munkki)
  432. Date: 5 Nov 1995 12:03:02 GMT
  433. Organization: Helsinki University of Technology
  434.  
  435. In article <47gmrn$qk@park.uvsc.edu> stay@park.uvsc.edu (Steve Taylor) writes:
  436. >I'm having trouble figuring out how to get good performance out of
  437. >appletalk for >2 players.  Using an existing library I had for
  438. >using PPCToolbox, I built my basic game, and it worked great for
  439. >two players.  But, as soon as I added a third player, the game
  440. >became pretty jerky, running 15 frames or so before freezing for
  441. >half a second and continuing.
  442.  
  443. >I'm doing asynchronous reads and writes, (using polling for completion,
  444. >not callback routines.  I'm scanning the keyboard instead of calling
  445. >GetNextEvent, so my polling routines should get called pretty
  446. >frequently with no long time between).  Also, this is a client-server
  447. >model, with the app "hosting" the game creating a server port and
  448. >its own client port, and with the other app joining the game with
  449. >just a client port.
  450.  
  451. I'm doing something quite similar: a networked arcade game that allows
  452. several players, uses the PPCToolbox with a client/server system and
  453. creates a virtual star topology by passing all messages through the server.
  454.  
  455. For two players, this means two packets of data for each frame (plus
  456. hidden overhead from the PPCToolbox). For three players, if information
  457. from each player is sent separately, it means six packets of data
  458. for each frame. For four players, it would twelve packets of data
  459. and so on until at six players, you are sending 30 packets of data.
  460.  
  461. LocalTalk is quite slow, so supporting even just a few players can
  462. be a problem unless you are really careful.
  463.  
  464. >Then, I wrote an ADSP class to replace the PPCToolbox class I was using,
  465. >and the game's slower even in 2-player mode.  Maybe I just haven't
  466. >done enough optimizing, but should using ADSP directly be faster than
  467. >using PPCToolbox?
  468.  
  469. I think they should be about the same, since PPCToolbox uses ADSP and
  470. adds only a few bytes extra that you can actually use to transmit
  471. data. PPCToolbox has the advantage of offering you a user interface
  472. for connecting to the server, so it is an excellent choice for almost
  473. any kind of networked applications over AppleTalk.
  474.  
  475. >What protocol do games like Armor Alley use?  Even with 4 players, this
  476. >game really cruises on a fast machine.  I know one player hosts a
  477. >game, but underneath do they use a client-server model or some
  478. >peer-to-peer model?
  479.  
  480. I'm just guessing, but I think most games uses DDP and possibly even
  481. DDP (or if they are totally crazy, ALAP) broadcasting. The problem
  482. with DDP is that it doesn't provide resending of lost packets. You
  483. have to do it yourself (ouch).
  484.  
  485. The problem with DDP broadcasts is that while they do work, you can't
  486. be guaranteed that they will work. The problem is that if you have
  487. two machines using DDP broadcasts, one might crash the other one.
  488. It's because in order to be able to do DDP broadcasts, all players
  489. have to use the same DDP socket number and no one else should be
  490. using them. To be able to use the same socket number, you have to
  491. use the range of "experimental" socket numbers (from 64 to 127).
  492. Apple forbids the use of these sockets for shipping products,
  493. because if two applications happen to use the same one, they will
  494. be sending incompatible data to each other, possibly causing a
  495. crash. (Ouch!)
  496.  
  497. Unfortunately it is hard to beat the advantages of broadcasting,
  498. since instead of the virtual star network, where you have to
  499. transmit at least 2n packets (or n * (n-1) data), you get away
  500. with n packets for n players.
  501.  
  502. >And, while we're on the subject, why can my application talk to itself
  503. >with PPCToolbox but when I try to establish a connection to a
  504. >connection listener in the same application with ADSP, I get an error?
  505. >(I'm getting -1277, I think, but only on the side that requests the
  506. >connection.  The connection listener thinks the connection attempt
  507. >succeeded.  Sorry, it's been a few weeks since I played with this.)
  508. >I am setting the SelfSend flag.
  509.  
  510. Maybe there's a problem with ADSP self sending? PPCToolbox will bypass
  511. networking protocols to talk to a local application, so ADSP is not
  512. involved.
  513.  
  514. >Thanks very much for any advice, and a belated "Wahoo!" for the creation
  515. >of this group.
  516.  
  517. I think the start has been quite promising. I feel like I'm revealing
  518. quite a few trade secrets here, but if we all do it, I will not feel
  519. quite that bad about it, because I might actually learn something that
  520. might save me some headaches later.
  521.  
  522. - --
  523.  
  524. Here comes the good part of this article (I hope).
  525.  
  526. PPCToolbox and localtalk are quite fast enough to support a real time
  527. arcade game with at least three to four players. I probably went
  528. through the same problems you had. In fact, I was getting bad results
  529. even with two players, when the other player was a slower machine that
  530. couldn't keep pace.
  531.  
  532. The important thing is that you should make the timing requirements
  533. loose enough so that the data has the longest possible time to travel
  534. between the machines.
  535.  
  536. Assuming you copy keyboard and mouse (or joystick) information between
  537. machines and run identical programs on each machine (the way Marathon
  538. works), you'll end up waiting a long time, if you send the data you
  539. need at the exact moment that the other machines need it. The key is to
  540. send this information as early as possible. That way you will use the
  541. full bandwidth that LocalTalk has to offer you. Also keep in mind that
  542. it is very hard to keep several machines sychronized exactly, so allow
  543. some slack in the timing too.
  544.  
  545. Even this will only work for a couple of players on LocalTalk if you
  546. are replicating a lot of packets with your virtual star network (as I
  547. am). You could of course make the server wait for the information from
  548. all other machines, combine that into a single buffer and send this
  549. buffer back to the other machines.
  550.  
  551. In the case of four players (one of which is the server), the server
  552. would have to wait for three packets, combine them into one _big_
  553. packet and send this packet back to the three clients. You end up
  554. sending three small packets and three big (4 times bigger) packets, but
  555. you probably save quite a bit of bandwidth because you send fewer
  556. packets (but the saving is all in the overhead).
  557.  
  558. Unfortunately collecting and combining will work against you if you
  559. want to have very loose timing, because now the data transmission is
  560. very hard to spread over a longer period of time and the machines tend
  561. to run too exactly in synch. Also, this architecture makes no sense at
  562. all when you start using a protocol that allows multicasting or
  563. broadcasting.
  564.  
  565. So, what could I do then? I didn't touch the PPCToolbox stuff, but I
  566. wrote additional code outside my main network transport classes to
  567. implement DDP and DDP broadcasting. Since there are obvious dangers and
  568. compatibility problems, the user can turn off these parts of the game
  569. and just use the more compatible stuff. In fact, I only use the DDP
  570. parts for really time critical frame information.
  571.  
  572. Remember the problem with DDP broadcasts? You'll actually be getting
  573. data from all over the net and if two simultaneous games are running in
  574. the same network, you'll receive all their data as well. It's like
  575. listening to several radio stations at the same time and some of them
  576. are not even in your own language.
  577.  
  578. Fortunately since you are broadcasting to the other nodes as well, you
  579. know all their network addresses and sockets and the packet header
  580. contains enough information so that you can reconstruct an address
  581. block data structure. If the sender is not on your list of friends, you
  582. just ignore the data.
  583.  
  584. Of course you have to remember that DDP broadcasts only reach one net
  585. at a time, so you may not get away with sending just one broadcast
  586. packet.
  587.  
  588. Writing DDP protocol handlers is one of the harder tasks that the
  589. Macintosh has to offer you, so good luck. Inside Macintosh has almost
  590. complete sample code. You'll need a multiple net network to test the
  591. code too (or at least Ethertalk) in order to test how your code handles
  592. long packet headers and a very simple localtalk network to test how
  593. your code works with short packet headers.
  594.  
  595. When DDP packets are lost, one or more machines are left waiting on the
  596. net. That's when I use the PPCToolbox again to ask for the lost data.
  597. This is much more convenient than trying to write my own protocol that
  598. uses DDP.
  599.  
  600. To recap, here's a quick list of things you should check you are doing
  601. correctly:
  602.  
  603.         1) Allow the machines to be only loosely in synch.
  604.  
  605.         2) Send needed data as early as possible so that it has time to
  606.         travel.
  607.  
  608.         3) Use broadcasting if you still have problems after 1 and 2.
  609.  
  610.         4) Allow the user to choose what protocols are used.
  611.  
  612. Due to network latency, networking algorithms that require machines to
  613. run in synch (such as sending keyboard/mouse information) will not run
  614. well over longer distances. Such is life in a relativistic world.
  615.  
  616. -- 
  617. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  618. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  619.  
  620. +++++++++++++++++++++++++++
  621.  
  622. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  623. Date: Sun, 05 Nov 1995 09:21:51 -0700
  624. Organization: BW Software
  625.  
  626. In article <47i95m$jd0@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  627.  
  628. [snip]
  629.  
  630. > I'm just guessing, but I think most games uses DDP and possibly even
  631. > DDP (or if they are totally crazy, ALAP) broadcasting. The problem
  632. > with DDP is that it doesn't provide resending of lost packets. You
  633. > have to do it yourself (ouch).
  634.  
  635.      Sometimes it isn't worth it to resend packets, IMHO.  Many of the
  636. games that I've played on the 'net have excessive problems with resolving
  637. lost packets.  When they try to fix this, the result is usually complete
  638. chaos, or at least interrupted/choppy gameplay.  
  639.  
  640.      I think a good suggestion came from one of the authors (or was it
  641. just one author?) of Spectre Supreme, which if I remember correctly is on
  642. the CDs that accompany "develop".  It basically stated that by saving some
  643. extra information about the tanks of other players (such as velocity and
  644. direction) the position of a player could be more or less guesstimated. 
  645. So for example, if player 2 is having some sort of network trouble and
  646. hasn't "called in" for up to 30 ticks, there shouldn't be much of a
  647. problem, the host machine (or maybe each player's machine...I need to read
  648. that article again ;) will compute the position of player 2 based on
  649. direction and velocity.  The down sides to this are that there will be
  650. more overhead (more information), and obviously this won't work if the
  651. network lag is too great.
  652.  
  653. > The problem with DDP broadcasts is that while they do work, you can't
  654. > be guaranteed that they will work. The problem is that if you have
  655. > two machines using DDP broadcasts, one might crash the other one.
  656. > It's because in order to be able to do DDP broadcasts, all players
  657. > have to use the same DDP socket number and no one else should be
  658. > using them. To be able to use the same socket number, you have to
  659. > use the range of "experimental" socket numbers (from 64 to 127).
  660. > Apple forbids the use of these sockets for shipping products,
  661. > because if two applications happen to use the same one, they will
  662. > be sending incompatible data to each other, possibly causing a
  663. > crash. (Ouch!)
  664. > Unfortunately it is hard to beat the advantages of broadcasting,
  665. > since instead of the virtual star network, where you have to
  666. > transmit at least 2n packets (or n * (n-1) data), you get away
  667. > with n packets for n players.
  668.  
  669.      Am I correct in assuming that there's still no way to write a
  670. PowerMac native DDP socket listener?  I've seen this question asked a few
  671. times, and the only answers I've read point to creating a 68k code
  672. resource that's called by the native code.  There *must* be a better
  673. alternative to this.
  674.  
  675. -- 
  676. "Nothin' like a fried 'nanner sandwich..."
  677. Eric A. Drumbor      
  678. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  679. BW Software
  680.  
  681. +++++++++++++++++++++++++++
  682.  
  683. >From stay@park.uvsc.edu (Steve Taylor)
  684. Date: 5 Nov 1995 14:53:30 -0700
  685. Organization: Utah Valley State College, Orem, Utah
  686.  
  687. Thanks Juri and Eric, for very informative responses.
  688.  
  689. Eric A. Drumbor (ericd@ra.nilenet.com) wrote:
  690.  
  691. :      I think a good suggestion came from one of the authors (or was it
  692. : just one author?) of Spectre Supreme, which if I remember correctly is on
  693. : the CDs that accompany "develop".  It basically stated that by saving some
  694. : extra information about the tanks of other players (such as velocity and
  695. : direction) the position of a player could be more or less guesstimated. 
  696. : So for example, if player 2 is having some sort of network trouble and
  697. : hasn't "called in" for up to 30 ticks, there shouldn't be much of a
  698. : problem, the host machine (or maybe each player's machine...I need to read
  699. : that article again ;) will compute the position of player 2 based on
  700. : direction and velocity.  The down sides to this are that there will be
  701. : more overhead (more information), and obviously this won't work if the
  702. : network lag is too great.
  703.  
  704. I've heard of this (probably you read it in the Game Developer's Handbook
  705. on the Apple Developer CD?) and I have a question about it:
  706.  
  707. What do you do with one player performs some action that requires
  708. immediate verification from the server, like stepping on a health-pack.
  709. This player can't assume it suceeded (since the pack may have timed out
  710. or been picked up / destroyed by someone else or something) so does
  711. he just freeze up until the server acknowledges him?
  712.  
  713. Juri says:
  714.  
  715. : > The problem with DDP broadcasts is that while they do work, you can't
  716. : > be guaranteed that they will work. The problem is that if you have
  717. : > two machines using DDP broadcasts, one might crash the other one.
  718. : > It's because in order to be able to do DDP broadcasts, all players
  719. : > have to use the same DDP socket number and no one else should be
  720. : > using them. To be able to use the same socket number, you have to
  721. : > use the range of "experimental" socket numbers (from 64 to 127).
  722. : > Apple forbids the use of these sockets for shipping products,
  723. : > because if two applications happen to use the same one, they will
  724. : > be sending incompatible data to each other, possibly causing a
  725. : > crash. (Ouch!)
  726.  
  727. OK, so what you're saying is that this would be a really cool way to
  728. do a network game and but Apple says no?  Lame...
  729.  
  730. Any idea if OpenTransport will be enough of a rewrite to provide
  731. broadcasting at some level?
  732.  
  733. Thanks.
  734.  
  735. -- 
  736. -- Steve Taylor (stay@wahoo.com  or  stay@park.uvsc.edu)
  737. --
  738. --  "Ha Ha," said Eeyore bitterly.  "Merriment and what-not.
  739. --  Don't apologize.  It's just what *would* happen."
  740.  
  741. +++++++++++++++++++++++++++
  742.  
  743. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  744. Date: Sun, 05 Nov 1995 16:34:18 -0700
  745. Organization: BW Software
  746.  
  747. In article <47jboq$mh5@park.uvsc.edu>, stay@park.uvsc.edu (Steve Taylor) wrote:
  748.  
  749. [snip]
  750.  
  751. > I've heard of this (probably you read it in the Game Developer's Handbook
  752. > on the Apple Developer CD?) and I have a question about it:
  753. > What do you do with one player performs some action that requires
  754. > immediate verification from the server, like stepping on a health-pack.
  755. > This player can't assume it suceeded (since the pack may have timed out
  756. > or been picked up / destroyed by someone else or something) so does
  757. > he just freeze up until the server acknowledges him?
  758.  
  759.      Personally, I'd make it a sort of "request" from player Mac to server
  760. Mac.  The health/bonus/whatever won't be counted until confirmation from
  761. the server is received.  In the meantime, the player just keeps playing. 
  762. The server can take the request, look at the status of this item, and take
  763. whatever actions are appropriate.  This would work best if the player's
  764. Mac wasn't expecting a confirmation or denial....if it receives a packet
  765. from the server that says "here's a bonus, use it" then the player Mac
  766. acts accordingly.  In other words, it won't be searching for some kind of
  767. special packet, and the server won't be wasting network bandwidth telling
  768. the player that the item wasn't obtained.
  769.  
  770.      The only problem with this would (of course) be excessive lag time. 
  771. If the character of player 2 is almost dead, and the health bonus is
  772. needed in 1 second because in two seconds a missle is going to make
  773. contact......lag time would spell doom for player 2, and unfairly so.  The
  774. only alternative is to allow the player's computer to make the judgement,
  775. which could mean that several players could get the same item because the
  776. server wasn't fast enough to send an update to the players.  It's really
  777. dependent on the game IMHO, you'll need to decide which is more fair or
  778. more entertaining to the players.
  779.  
  780. -- 
  781. "Nothin' like a fried 'nanner sandwich..."
  782. Eric A. Drumbor      
  783. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  784. BW Software
  785.  
  786. +++++++++++++++++++++++++++
  787.  
  788. >From jmunkki@beta.hut.fi (Juri Munkki)
  789. Date: 6 Nov 1995 13:40:53 GMT
  790. Organization: Helsinki University of Technology
  791.  
  792. In article <ericd-0511950921510001@slip1.nilenet.com> ericd@ra.nilenet.com (Eric A. Drumbor) writes:
  793. >     Sometimes it isn't worth it to resend packets, IMHO.  Many of the
  794. >games that I've played on the 'net have excessive problems with resolving
  795. >lost packets.  When they try to fix this, the result is usually complete
  796. >chaos, or at least interrupted/choppy gameplay.  
  797.  
  798. This depends on how you implement networking. In a game where there are a lot
  799. of automatons that react to the actions of the players, you either have to
  800. guarantee that their actions are the same on all machines or that information
  801. is transmitted over the network. Usually it is just easier to run the exact
  802. same process on each machine and use the network as a sort of virtual joystick
  803. port. If there are bugs in the game or information is altered or lost, the
  804. games on each machine will start to diverge.
  805.  
  806. As I understand it, Marathon uses the "virtual joystick interface" approach
  807. and it had some bugs in the early versions.
  808.  
  809. >     I think a good suggestion came from one of the authors (or was it
  810. >just one author?) of Spectre Supreme, which if I remember correctly is on
  811. >the CDs that accompany "develop".  It basically stated that by saving some
  812. >extra information about the tanks of other players (such as velocity and
  813. >direction) the position of a player could be more or less guesstimated. 
  814.  
  815. This is a good approach when the players are likely to be far apart
  816. geographically, because then you have to deal with long delays. You
  817. have to accept that each player may have his/her own view of what
  818. happened in the world. The rules for missile hits and such have to
  819. be very clear, since you can't have a robot exploding on one screen
  820. and surviving on another one. (The owner of the object has the final
  821. say.) Of course then you have a lot of objects that need owners and
  822. you have to keep sending this information over the network.
  823.  
  824. >direction and velocity.  The down sides to this are that there will be
  825. >more overhead (more information), and obviously this won't work if the
  826. >network lag is too great.
  827.  
  828. All information has to be time stamped so that data can be extrapolated
  829. correctly.
  830.  
  831. >     Am I correct in assuming that there's still no way to write a
  832. >PowerMac native DDP socket listener?  I've seen this question asked a few
  833. >times, and the only answers I've read point to creating a 68k code
  834. >resource that's called by the native code.  There *must* be a better
  835. >alternative to this.
  836.  
  837. Check the latest Appletalk headers. I saw something there, but it looked
  838. quite complicated and not really relevant to the 68K code that I was
  839. writing.
  840.  
  841. Should we try to agree on a de facto standard for the use of DDP
  842. broadcasts in games? Choose a socket number that we all use for this
  843. purpose and check the sender address before accepting the packets.
  844. (This only works as long as a single copy of a game is running on
  845. a machine, since sockets can not be shared.)
  846.  
  847. -- 
  848. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  849. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  850.  
  851. +++++++++++++++++++++++++++
  852.  
  853. >From pottier@drakkar.ens.fr (Francois Pottier)
  854. Date: 6 Nov 1995 14:43:29 GMT
  855. Organization: Ecole Normale Superieure, Paris
  856.  
  857. In article <ericd-0511950921510001@slip1.nilenet.com>,
  858. Eric A. Drumbor <ericd@ra.nilenet.com> wrote:
  859.  
  860. >     Sometimes it isn't worth it to resend packets, IMHO.
  861.  
  862. Yes. Try to design your client so that it works even if it has to skip
  863. a few packets. That should save tremendous time and effort.
  864.  
  865. >     Am I correct in assuming that there's still no way to write a
  866. >PowerMac native DDP socket listener?
  867.  
  868. As far as I know, there is none. However, as long as AppleTalk is
  869. emulated, you *don't* want to write one; the double mode switch will
  870. cost you a lot of time every time you receive a packet. So, just keep
  871. your old 68K listener. By the way, using the old (non-preferred) DDP
  872. interface it is possible to receive DDP packets without writing a
  873. listener (you have to poll the parameter block).
  874.  
  875. -- 
  876. Francois
  877. pottier@dmi.ens.fr
  878. http://www.eleves.ens.fr:8080/home/pottier/
  879.  
  880. +++++++++++++++++++++++++++
  881.  
  882. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  883. Date: Mon, 06 Nov 1995 08:11:19 -0700
  884. Organization: BW Software
  885.  
  886. In article <47l396$vgl@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  887.  
  888. [excellent networking info snipped]
  889.  
  890. > >     Am I correct in assuming that there's still no way to write a
  891. > >PowerMac native DDP socket listener?  I've seen this question asked a few
  892. > >times, and the only answers I've read point to creating a 68k code
  893. > >resource that's called by the native code.  There *must* be a better
  894. > >alternative to this.
  895. > Check the latest Appletalk headers. I saw something there, but it looked
  896. > quite complicated and not really relevant to the 68K code that I was
  897. > writing.
  898.  
  899.      I have to admit that I haven't looked into the networking aspect for
  900. quite a few months.  I took a quick look at IM:Networking yesterday, and
  901. now I'm wondering if it really wouldn't be such a bad idea to try to write
  902. the socket listener in PPC assembly using CW7 and it's function level
  903. assembler.  Wasn't the whole problem with the listener written in PPC asm
  904. due to the fact that register usage wasn't specified?
  905.  
  906. > Should we try to agree on a de facto standard for the use of DDP
  907. > broadcasts in games? Choose a socket number that we all use for this
  908. > purpose and check the sender address before accepting the packets.
  909. > (This only works as long as a single copy of a game is running on
  910. > a machine, since sockets can not be shared.)
  911.  
  912.      I think we definitely should try to establish some standards, great
  913. suggestion.  Why not reserve a few sockets?  Like five?  Five sockets
  914. would make allowances for multiple games being played (in the off chance
  915. that is occurring) or allow for a game that uses multiple sockets (some
  916. future game).  There's little chance that someone would be using more than
  917. five games at any given time on their Mac, but just to be safe...  This
  918. would obviously create more work, since the games need to contact each
  919. other (probably via dynamic socket) to agree on which socket to use, but I
  920. wouldn't want to set anything as a standard (ableit de facto) that didn't
  921. have a little breathing room.
  922.  
  923.      Do we have a faq for this group yet?  If not, we better get something
  924. together.  If we're going to be a little "god-like" we should have a faq
  925. for newcomers....and people who aren't reading this thread...and better
  926. still, people like myself who forget this stuff within a few days :-)
  927.  
  928. -- 
  929. "Nothin' like a fried 'nanner sandwich..."
  930. Eric A. Drumbor      
  931. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  932. BW Software
  933.  
  934. +++++++++++++++++++++++++++
  935.  
  936. >From jmunkki@beta.hut.fi (Juri Munkki)
  937. Date: 6 Nov 1995 17:55:44 GMT
  938. Organization: Helsinki University of Technology
  939.  
  940. In article <47jboq$mh5@park.uvsc.edu> stay@park.uvsc.edu (Steve Taylor) writes:
  941. >Juri says:
  942. >: > The problem with DDP broadcasts is that while they do work, you can't
  943. >: > be guaranteed that they will work. The problem is that if you have
  944. >: > two machines using DDP broadcasts, one might crash the other one.
  945. >: > It's because in order to be able to do DDP broadcasts, all players
  946. >: > have to use the same DDP socket number and no one else should be
  947. >: > using them. To be able to use the same socket number, you have to
  948. >: > use the range of "experimental" socket numbers (from 64 to 127).
  949. >: > Apple forbids the use of these sockets for shipping products,
  950. >: > because if two applications happen to use the same one, they will
  951. >: > be sending incompatible data to each other, possibly causing a
  952. >: > crash. (Ouch!)
  953.  
  954. >OK, so what you're saying is that this would be a really cool way to
  955. >do a network game and but Apple says no?  Lame...
  956.  
  957. Well...Apple says that you shouldn't draw directly to the screen, since
  958. it might break. Apple also says that you shouldn't move the mouse cursor
  959. under program control, but several games need to do this.
  960.  
  961. As in the case of direct screen drawing and mouse motion, Apple explains
  962. what the dangers are and similarly if something like this is implemented
  963. in a game, the safest thing to do is to leave the final say to the user.
  964.  
  965. In my game, the user has three levels of networking: PPCToolbox only,
  966. DDP based and DDP broadcast based. The user can choose the one that
  967. works best. In most cases, the DDP based method works well enough.
  968.  
  969. For localtalk networks with a lot of players, the broadcasting version
  970. may have to be used. The only machines it can hurt are ones that
  971. choose to listen to this same socket AND that expect some specific data
  972. format AND do not check where the data is coming from.
  973.  
  974. My advice is: go ahead and implement DDP broadcasting, but do it right.
  975.  
  976. (The same goes for direct to screen drawing: if you do it wrong, you
  977. are going to crash quite a few machines.)
  978.  
  979. -- 
  980. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  981. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  982.  
  983. +++++++++++++++++++++++++++
  984.  
  985. >From jmunkki@beta.hut.fi (Juri Munkki)
  986. Date: 7 Nov 1995 09:06:11 GMT
  987. Organization: Helsinki University of Technology
  988.  
  989. In article <ericd-0611950811190001@slip5.nilenet.com> ericd@ra.nilenet.com (Eric A. Drumbor) writes:
  990. >In article <47l396$vgl@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  991. >> Should we try to agree on a de facto standard for the use of DDP
  992. >> broadcasts in games? Choose a socket number that we all use for this
  993. >> purpose and check the sender address before accepting the packets.
  994. >> (This only works as long as a single copy of a game is running on
  995. >> a machine, since sockets can not be shared.)
  996.  
  997. >     I think we definitely should try to establish some standards, great
  998. >suggestion.  Why not reserve a few sockets?  Like five?  Five sockets
  999. >would make allowances for multiple games being played (in the off chance
  1000. >that is occurring) or allow for a game that uses multiple sockets (some
  1001. >future game).  There's little chance that someone would be using more than
  1002. >five games at any given time on their Mac, but just to be safe...  This
  1003. >would obviously create more work, since the games need to contact each
  1004. >other (probably via dynamic socket) to agree on which socket to use, but I
  1005. >wouldn't want to set anything as a standard (ableit de facto) that didn't
  1006. >have a little breathing room.
  1007.  
  1008. For DDP broadcasts, every machine in the game has to use the same socket
  1009. number. So if five sockets are reserved and the one all the other machines
  1010. want is taken on one machine, all the machines would have to use the other
  1011. socket and the negotiation process could be complicated. In my case, I
  1012. would just forget about broadcasting and reserve a regular DDP socket
  1013. for the machine where the broadcast socket was not available.
  1014.  
  1015. I don't have anything against "reserving" multiple sockets, but I feel
  1016. that only one is really needed. Only 64 of these special sockets exist
  1017. in any case. Another option would be to ask Apple to give us one of the
  1018. first 64 sockets (in the 0-63 range). That would make things a lot
  1019. more official and sort of establish a game networking broadcast protocol
  1020. of sorts...
  1021.  
  1022. >     Do we have a faq for this group yet?  If not, we better get something
  1023. >together.  If we're going to be a little "god-like" we should have a faq
  1024. >for newcomers....and people who aren't reading this thread...and better
  1025. >still, people like myself who forget this stuff within a few days :-)
  1026.  
  1027. I think I saw a skeleton for an FAQ among the first articles in this newsgroup,
  1028. but I didn't really read it thoroughly.
  1029.  
  1030. I'm going to keep any long articles I write archived under my WWW page, so
  1031. if someone missed my original answer to this thread, it can still be found
  1032. here: http://www.hut.fi/~jmunkki/misc
  1033.  
  1034. -- 
  1035. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  1036. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  1037.  
  1038. +++++++++++++++++++++++++++
  1039.  
  1040. >From stay@park.uvsc.edu (Steve Taylor)
  1041. Date: 7 Nov 1995 19:37:42 -0700
  1042. Organization: Utah Valley State College, Orem, Utah
  1043.  
  1044.  
  1045. I think trying to convince Apple to give us a few socket numbers
  1046. for sanctioned broadcasting is a great idea.  Perhaps
  1047. Eric Klein (the Game Evangelist at Apple) could help with this?
  1048. I'm pretty sure his address is klein@apple.com, if someone
  1049. wants to take it upon themselves to bug him about this...
  1050.  
  1051. -- 
  1052. -- Steve Taylor (stay@wahoo.com  or  stay@park.uvsc.edu)
  1053. --
  1054. --  "Ha Ha," said Eeyore bitterly.  "Merriment and what-not.
  1055. --  Don't apologize.  It's just what *would* happen."
  1056.  
  1057. +++++++++++++++++++++++++++
  1058.  
  1059. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  1060. Date: 8 Nov 1995 12:42:10 GMT
  1061. Organization: (none)
  1062.  
  1063. jmunkki@beta.hut.fi (Juri Munkki) writes:
  1064.  
  1065. >I'm just guessing, but I think most games uses DDP and possibly even
  1066. >DDP (or if they are totally crazy, ALAP) broadcasting.
  1067.  
  1068. I have to ask: why is ALAP "crazy"? Yes, it is limited to AppleTalk only,
  1069. it is old, but it has broadcasting built-in. If you accept that the game
  1070. you make is standard-Appletalk only, isn't this a pretty easy way to get
  1071. broadcasting?
  1072.  
  1073. --
  1074. - -
  1075. Ingemar Ragnemalm, PhD
  1076. Image processing, Mac shareware games
  1077. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  1078.  
  1079. +++++++++++++++++++++++++++
  1080.  
  1081. >From hughf@cs.anu.edu.au (Hugh Fisher)
  1082. Date: 9 Nov 1995 09:40:58 +1100
  1083. Organization: Australian National University
  1084.  
  1085. In article vgl@nntp.hut.fi,  jmunkki@beta.hut.fi (Juri Munkki) writes:
  1086.  
  1087. > [ munch ]
  1088. >
  1089. >Should we try to agree on a de facto standard for the use of DDP
  1090. >broadcasts in games? Choose a socket number that we all use for this
  1091. >purpose and check the sender address before accepting the packets.
  1092. >(This only works as long as a single copy of a game is running on
  1093. >a machine, since sockets can not be shared.)
  1094.  
  1095.   *Multicast*, please, not broadcast. On LocalTalk it doesn't matter
  1096.   since AFAIK multicast = broadcast in the implementation. But if you
  1097.   broadcast on Ethernet, every host, not just those playing the game,
  1098.   has to process a 'packet received' interrupt. This is why Doom is
  1099.   so unpopular with network managers. If you multicast, then only the
  1100.   the hosts actively listening for that address process the packets.
  1101.   (The network may still be saturated with your game traffic, but at
  1102.   least nobody can complain that you're slowing down their CPU.)
  1103.  
  1104.         Hugh Fisher
  1105.  
  1106.  
  1107.  
  1108. +++++++++++++++++++++++++++
  1109.  
  1110. >From jmunkki@beta.hut.fi (Juri Munkki)
  1111. Date: 9 Nov 1995 09:27:32 GMT
  1112. Organization: Helsinki University of Technology
  1113.  
  1114. In article <47rblq$1i6@procyon.anu.edu.au> hughf@cs.anu.edu.au writes:
  1115. >  *Multicast*, please, not broadcast.
  1116.  
  1117. Show us a way to do multicasting with AppleTalk and we might do it.
  1118. Just remember that it has to work with LocalTalk too...
  1119.  
  1120. Why? Because it's very hard for you to tell what kind of network you
  1121. are sending to. I have tested my game in a network with a mix of
  1122. different network types. DDP broadcasting worked on all of them,
  1123. because it is part of the AppleTalk protocol.
  1124.  
  1125. Part of the reason is also because I happen to like solutions
  1126. that work on all platforms. I find it very frustrating if I have
  1127. to check for specific hardware and software features before I can
  1128. use them. It also makes things a lot more complicated for the
  1129. beginners when things like networking are already more complicated
  1130. than they need to be.
  1131.  
  1132. -- 
  1133. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  1134. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  1135.  
  1136. +++++++++++++++++++++++++++
  1137.  
  1138. >From jmunkki@beta.hut.fi (Juri Munkki)
  1139. Date: 9 Nov 1995 15:46:41 GMT
  1140. Organization: Helsinki University of Technology
  1141.  
  1142. In article <47q8j3$6ug@newsy.ifm.liu.se> ingemar@lysator.liu.se (Ingemar Ragnemalm) writes:
  1143. >I have to ask: why is ALAP "crazy"? Yes, it is limited to AppleTalk only,
  1144. >it is old, but it has broadcasting built-in. If you accept that the game
  1145. >you make is standard-Appletalk only, isn't this a pretty easy way to get
  1146. >broadcasting?
  1147.  
  1148. You have to look at the benefits and disadvantages. The only benefit I see
  1149. is that there's slightly less overhead involved. The big disadvantage is
  1150. that it doesn't travel across network bridges, so you are limited to a
  1151. very local network only.
  1152.  
  1153. On the other hand, I have used DDP on a net that had one LocalTalk (PhoneNet)
  1154. net and two Ethernets. The only thing you have to do is to send a broadcast
  1155. to each separate net (as broadcasts are fortunately limited to a single
  1156. net).
  1157.  
  1158. In other respects, ALAP and DDP are quite similar and the amount of work
  1159. involved to use them is the same.
  1160.  
  1161. Also, if I remember correctly, some network types do not implement ALAP
  1162. at all (I think Apple Remote Access might be one of them).
  1163.  
  1164. -- 
  1165. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  1166. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  1167.  
  1168. +++++++++++++++++++++++++++
  1169.  
  1170. >From duerksen@lilly.com (Joel L Duerksen)
  1171. Date: Tue, 14 Nov 1995 10:06:06 -0500
  1172. Organization: Eli Lilly and Company
  1173.  
  1174.  
  1175. >   *Multicast*, please, not broadcast. On LocalTalk it doesn't matter
  1176. >   since AFAIK multicast = broadcast in the implementation. But if you
  1177. >   broadcast on Ethernet, every host, not just those playing the game,
  1178. >   has to process a 'packet received' interrupt. This is why Doom is
  1179. >   so unpopular with network managers.
  1180. unfortunately their FIRST version did use broadcast.  None after that
  1181. have.
  1182.  
  1183. > If you multicast, then only the
  1184. >   the hosts actively listening for that address process the packets.
  1185. >   (The network may still be saturated with your game traffic, but at
  1186. >   least nobody can complain that you're slowing down their CPU.)
  1187. Also unfortunately most networks and routers don't properly
  1188. support multicast yet.
  1189.  
  1190. ---------------------------
  1191.  
  1192. >From e_ikeda@mbox.kyoto-inet.or.jp (Eiji Ikeda)
  1193. Subject: Help How to draw Japanese Text by GX.
  1194. Date: Fri, 10 Nov 1995 21:55:10 +0900
  1195. Organization: (empty)
  1196.  
  1197. I can't draw Japanese Text by GX.
  1198.  
  1199. My source codes are ...
  1200.  
  1201.    gxFont myFont;
  1202.  
  1203.    long numJfonts = GXFindFonts (nil, gxFullFontName,
  1204.             gxMacintoshPlatform, gxJapaneseScript, gxNoLanguage,
  1205.                   strlen ("Osaka"),
  1206.                   (unsigned char const *) "Osaka", 1, 1, &myFont);
  1207.    aShape = GXNewText (12, (unsigned char const *) "(Kanji Text 12 len)",
  1208.          &textPosition);
  1209.    SetShapeCommonColor (aShape, blue);
  1210.    GXSetShapeFont (aShape, myFont);
  1211.    GXDrawShape (aShape);
  1212.    GXDisposeShape (aShape);
  1213.  
  1214. By this, some unreadable objects are drawn. They are not kanji text.
  1215. What Shall I do?
  1216.  
  1217. -- 
  1218. Eiji Ikeda
  1219. e_ikeda@mbox.kyoto-inet.or.jp
  1220. asciinet: net07199 (alf)
  1221. NIFTY: PEA03350
  1222.  
  1223. +++++++++++++++++++++++++++
  1224.  
  1225. >From opstad@apple.com (David Opstad)
  1226. Date: 12 Nov 1995 15:54:58 -0800
  1227. Organization: Apple Computer Inc, Cupertino, CA
  1228.  
  1229. In article <e_ikeda-1011952155100001@ppp037.kyoto-inet.or.jp>,
  1230. Eiji Ikeda <e_ikeda@mbox.kyoto-inet.or.jp> wrote:
  1231. >I can't draw Japanese Text by GX.
  1232. >
  1233. >My source codes are ...
  1234. >
  1235. >   gxFont myFont;
  1236. >
  1237. >   long numJfonts = GXFindFonts (nil, gxFullFontName,
  1238. >            gxMacintoshPlatform, gxJapaneseScript, gxNoLanguage,
  1239. >                  strlen ("Osaka"),
  1240. >                  (unsigned char const *) "Osaka", 1, 1, &myFont);
  1241. >   aShape = GXNewText (12, (unsigned char const *) "(Kanji Text 12 len)",
  1242. >         &textPosition);
  1243. >   SetShapeCommonColor (aShape, blue);
  1244. >   GXSetShapeFont (aShape, myFont);
  1245. >   GXDrawShape (aShape);
  1246. >   GXDisposeShape (aShape);
  1247. >
  1248. >By this, some unreadable objects are drawn. They are not kanji text.
  1249. >What Shall I do?
  1250.  
  1251. In order to use the correct mapping, you need to attach an encoding to the
  1252. shape, telling it to use the Japanese encoding. Add this line:
  1253.  
  1254. GXSetShapeEncoding(aShape, gxMacintoshPlatform, gxJapaneseScript, 0);
  1255.  
  1256. That should fix the problem. Also remember that GXNewText takes a character
  1257. count, and not a byte count -- by passing 12 in your call, you are telling
  1258. GX that you are providing 24 bytes of 2-byte text.
  1259.  
  1260. Dave Opstad
  1261. GX Line Layout Weenie
  1262.  
  1263. ---------------------------
  1264.  
  1265. >From molly@ins.infonet.net (molly gilmore-baldwin)
  1266. Subject: Hierarchical Menus in Apple Menu
  1267. Date: Sun, 12 Nov 1995 22:13:25 -0600
  1268. Organization: INS Info Services, Des Moines, Iowa, USA
  1269.  
  1270. I apologize in advance.  I remember this subject being discussed in detail
  1271. before. However, I tried what I thought had been the recommendation, and
  1272. it isn't working for me.
  1273.  
  1274. It's the old: I create my menu bar, and I don't get hierarchical menus
  1275. under the apple menu (Using Apple Menu Options).  I get my own
  1276. hierarchical menu just fine.
  1277.  
  1278. System 7.5, Codewarrior 7.
  1279.  
  1280. Any help would be appreciated.  Also, if this info is anywhere I could
  1281. have found it, I'd like to know where.  Before posting this, I spent quite
  1282. a while hunting the net.  Thanks.
  1283.  
  1284. +++++++++++++++++++++++++++
  1285.  
  1286. >From axlrosen@tiac.net (Alex Rosen)
  1287. Date: Mon, 13 Nov 1995 23:10:04 -0500
  1288. Organization: The Internet Access Company
  1289.  
  1290. In article <molly-1211952213250001@s063.netins.net>, molly@ins.infonet.net
  1291. (molly gilmore-baldwin) wrote:
  1292.  
  1293. >It's the old: I create my menu bar, and I don't get hierarchical menus
  1294. >under the apple menu (Using Apple Menu Options). 
  1295.  
  1296. Make sure you're calling both InitMenus and MaxApplZone at the beginning
  1297. of your program.
  1298.  
  1299. --Alex
  1300.  
  1301. +++++++++++++++++++++++++++
  1302.  
  1303. >From molly@ins.infonet.net (molly gilmore-baldwin)
  1304. Date: Tue, 14 Nov 1995 07:46:56 -0600
  1305. Organization: INS Info Services, Des Moines, Iowa, USA
  1306.  
  1307. In article <axlrosen-1311952310040001@205.161.42.140>, axlrosen@tiac.net
  1308. (Alex Rosen) wrote:
  1309.  
  1310. > In article <molly-1211952213250001@s063.netins.net>, molly@ins.infonet.net
  1311. > (molly gilmore-baldwin) wrote:
  1312. > >It's the old: I create my menu bar, and I don't get hierarchical menus
  1313. > >under the apple menu (Using Apple Menu Options). 
  1314. > Make sure you're calling both InitMenus and MaxApplZone at the beginning
  1315. > of your program.
  1316. > --Alex
  1317. Thank you. That was it.
  1318.  
  1319. ---------------------------
  1320.  
  1321. >From "Stephen E. Maas" <do485@cwru.edu>
  1322. Subject: How do I patch SFGetFile (or packages in general)
  1323. Date: Tue, 14 Nov 1995 05:56:31 GMT
  1324. Organization: Maasware Enterprises
  1325.  
  1326. I need to patch SFGetFile. How do I go about this? I am not sure how to 
  1327. pass selector codes with NSetTrapAddress. Is that how it is done? Source 
  1328. examples would be great, but all I really need is a brief explanation 
  1329. (if there is one).
  1330.  
  1331. Please don't offer alternatives to patching SFGetFile, as there are none 
  1332. for what I need to do (if there were, I wouldn't be trying this). 
  1333.  
  1334. Thanks.
  1335.  
  1336. --
  1337. Stephen E Maas   #   Microsoft Network is prohibited from redistributing 
  1338. (612) 457-5478   #   this work in any form, in whole or in part.  
  1339. License
  1340. do485@cwru.edu   #   to distribute this post is available to Microsoft 
  1341. for 
  1342. "Been there,     #   $95.00.  Posting without permission constitutes an
  1343. done that."      #   agreement to these terms.
  1344. - Apple Computer 
  1345.   Regarding Windows 95
  1346.  
  1347.  
  1348.  
  1349. +++++++++++++++++++++++++++
  1350.  
  1351. >From jwwalker@electriciti.com (James W. Walker)
  1352. Date: Tue, 14 Nov 1995 20:32:54 -0800
  1353. Organization: Nisus Software
  1354.  
  1355. In article <DI0r8q.FDq@news.cis.umn.edu>, "Stephen E. Maas"
  1356. <do485@cwru.edu> wrote:
  1357.  
  1358. > I need to patch SFGetFile. How do I go about this? I am not sure how to 
  1359. > pass selector codes with NSetTrapAddress. Is that how it is done?
  1360.  
  1361. Nope, that's not how it's done.  You patch _Pack3, the trap that
  1362. implements Standard File, and your patch looks for the selector code.  So
  1363. far as I know, you can't do this in a high-level language.  You also can't
  1364. do it PowerPC-native.  So we're talking 68K assembly language.
  1365. -- 
  1366.  Jim Walker
  1367.  
  1368. +++++++++++++++++++++++++++
  1369.  
  1370. >From bill@scconsult.com (Bill Stewart-Cole)
  1371. Date: Wed, 15 Nov 1995 20:38:08 -0600
  1372. Organization: ZOG
  1373.  
  1374. In article <DI0r8q.FDq@news.cis.umn.edu>, "Stephen E. Maas"
  1375. <do485@cwru.edu> wrote:
  1376.  
  1377. >I need to patch SFGetFile. How do I go about this? I am not sure how to 
  1378. >pass selector codes with NSetTrapAddress. Is that how it is done? Source 
  1379. >examples would be great, but all I really need is a brief explanation 
  1380. >(if there is one).
  1381.  
  1382. Speaking to selector traps in general, the only way is to patch the trap
  1383. as a whole and pass thru the calls with selectors you don't want to fiddle
  1384. with. Preferably as a head-only patch that covers its tracks before
  1385. passing thru to the real trap. 
  1386.  
  1387. >Please don't offer alternatives to patching SFGetFile, as there are none 
  1388. >for what I need to do (if there were, I wouldn't be trying this). 
  1389.  
  1390. Are you sure that CustomGetFile is not going to cut it?
  1391. -- 
  1392. Bill Stewart-Cole
  1393. What is Stewart-Cole Consulting?
  1394. Hell if I know. I'll find out when I finish the web page. 
  1395. Current projected date: 12/1. I'm not saying what year
  1396.  
  1397. ---------------------------
  1398.  
  1399. >From tah92@ecs.soton.ac.uk (Thomas Haggie)
  1400. Subject: How do you get to use the utility backdrop as used by find file?
  1401. Date: 13 Nov 1995 13:04:21 GMT
  1402. Organization: Electronics and Computer Science, University of Southampton
  1403.  
  1404. Hello;
  1405.         I was wondering how to get and use the pattern ( set by option
  1406. clicking in the Desktop Patterns control panel ) used by Find File etc. 
  1407. to use it in my own little Utilities?
  1408.  
  1409.                         All help appreciated 
  1410.  
  1411.                                         -*TOM*-
  1412.  
  1413. tah92@ecs.soton.ac.uk    http://whirligig.ecs.soton.ac.uk/~tah92/cv.html
  1414.  
  1415. +++++++++++++++++++++++++++
  1416.  
  1417. >From Matt Slot <fprefect@umich.edu>
  1418. Date: 14 Nov 1995 03:01:24 GMT
  1419. Organization: University of Michigan
  1420.  
  1421. Thomas Haggie, tah92@ecs.soton.ac.uk writes:
  1422.  >     I was wondering how to get and use the pattern ( set by option
  1423.  > clicking in the Desktop Patterns control panel ) used by Find File etc. 
  1424.  > to use it in my own little Utilities?
  1425.  
  1426. Its just a 'ppat' resource within the System file (like 7.1 or later, I
  1427. think). Like the desktop pattern has ID = 16, the util pattern has ID=42
  1428. (use ResEdit to find out for certain). Just load the PPAT as normal.
  1429.  
  1430. Matt
  1431.  
  1432. +++++++++++++++++++++++++++
  1433.  
  1434. >From jwbaxter@olympus.net (John W. Baxter)
  1435. Date: Mon, 13 Nov 1995 23:08:42 -0800
  1436. Organization: Townsend Communications
  1437.  
  1438. In article <4890q4$is3@srvr1.engin.umich.edu>, Matt Slot
  1439. <fprefect@umich.edu> wrote:
  1440.  
  1441. > Its just a 'ppat' resource within the System file (like 7.1 or later, I
  1442. > think). Like the desktop pattern has ID = 16, the util pattern has ID=42
  1443. > (use ResEdit to find out for certain). Just load the PPAT as normal.
  1444.  
  1445. And as with other System file resources, remember to forget to clean it up
  1446. after getting it...the handle you get may be in use by another
  1447. process...making it go away is bad form (and leads to bad results).
  1448.  
  1449.    --John
  1450.  
  1451. -- 
  1452.   "This item is not available because it cannot be removed."
  1453. John W. Baxter    Port Ludlow, WA     jwbaxter@olympus.net
  1454.  
  1455. ---------------------------
  1456.  
  1457. >From rcgh@teleport.com (Rasmussen/Hugos Family)
  1458. Subject: Mac Texture Mapping code needed
  1459. Date: Thu, 09 Nov 1995 18:06:14 -0800
  1460. Organization: Teleport - Portland's Public Access (503) 220-1016
  1461.  
  1462. Hello,
  1463.  
  1464. I am a slighly experienced mac programmer using CodeWarrior. I need to do
  1465. some texture mapping, but no where can I find any code to do it, and I
  1466. really don't want to resort to QuickDraw 3D. Can anyone tell me where to
  1467. get an idea on how to do this? (e.g. book, source code...)
  1468.  
  1469.  
  1470. Thank you very much
  1471.  
  1472. +++++++++++++++++++++++++++
  1473.  
  1474. >From songer@lexmark.com
  1475. Date: Mon, 13 Nov 1995 14:36:52 GMT
  1476. Organization: Lexmark International, Lexington, KY
  1477.  
  1478. In article <rcgh-0911951806140001@ip-pdx12-26.teleport.com> rcgh@teleport.com (Rasmussen/Hugos Family) writes:
  1479.  
  1480.    [...]
  1481.    I am a slighly experienced mac programmer using CodeWarrior. I need to do
  1482.    some texture mapping, but no where can I find any code to do it, and I
  1483.    really don't want to resort to QuickDraw 3D. Can anyone tell me where to
  1484.    get an idea on how to do this? (e.g. book, source code...)
  1485.    [...]
  1486.  
  1487. Hi!
  1488.  
  1489.      Game Developer magazine has had a running series on texture
  1490. mapping. I have found it quite informative. 
  1491.  
  1492. Anyway,
  1493. -Chris
  1494.  
  1495. +++++++++++++++++++++++++++
  1496.  
  1497. >From koffer@io.com (Ken Offer)
  1498. Date: Mon, 13 Nov 1995 15:10:47 -0600
  1499. Organization: Illuminati Online
  1500.  
  1501. Check out "Graphics Gems", edited by Andrew Glassner, published by
  1502. Academic Press.  Page 84 describes a convex polygon scan conversion
  1503. routine with provisions for texture mapping.  Sadly, it is not a complete
  1504. example of texture mapping, and it is written using some very tricky code
  1505. which is a clear abomination before all sentient life-forms.
  1506.  
  1507. Combine that with a snippet on page 363 from "Principles of Interactive
  1508. Computer Graphics" describing the mysterious "w" variable (sometimes known
  1509. as "sw") and homogeneous coordinates, and after a few days of
  1510. head-scratching and determination you may achieve nervana.
  1511.  
  1512.  
  1513. In article <rcgh-0911951806140001@ip-pdx12-26.teleport.com>,
  1514. rcgh@teleport.com (Rasmussen/Hugos Family) wrote:
  1515.  
  1516. > Hello,
  1517. > I am a slighly experienced mac programmer using CodeWarrior. I need to do
  1518. > some texture mapping, but no where can I find any code to do it, and I
  1519. > really don't want to resort to QuickDraw 3D. Can anyone tell me where to
  1520. > get an idea on how to do this? (e.g. book, source code...)
  1521. > Thank you very much
  1522.  
  1523. +++++++++++++++++++++++++++
  1524.  
  1525. >From checker@netcom.com (Chris Hecker)
  1526. Date: Tue, 14 Nov 1995 09:55:46 GMT
  1527. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1528.  
  1529. >> I am a slighly experienced mac programmer using CodeWarrior. I need to do
  1530. >> some texture mapping, but no where can I find any code to do it, and I
  1531. >> really don't want to resort to QuickDraw 3D. Can anyone tell me where to
  1532. >> get an idea on how to do this? (e.g. book, source code...)
  1533.  
  1534. Shameless plug: You might check out my articles in Game Developer
  1535. Magazine.  I cover the math behind perspective texture mapping and
  1536. provide source code that you could easily port to the mac (you'd just
  1537. change the bitmap structure that it draws into).  You'll probably want
  1538. the apr/may, jun/jul, and aug/sep issues, and you can order back issues
  1539. from (800) 444-4881.
  1540.  
  1541. Chris
  1542.  
  1543.  
  1544. ---------------------------
  1545.  
  1546. >From english@primenet.com (Lawson English)
  1547. Subject: OpenDoc is here (for the Mac!!!
  1548. Date: 7 Nov 1995 18:37:38 GMT
  1549. Organization: Primenet (602)395-1010
  1550.  
  1551. Point your Web browser to www.info.apple.com (I think). APple just put 
  1552. out a press release that they are now shipping OpenDoc...
  1553.  
  1554. The SDK will be available for ftp by November 10.
  1555.  
  1556.  
  1557. --
  1558. - -----------------------------------------------------------------------------
  1559. Lawson English                            __  __     ____  ___       ___ ____
  1560. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  1561.                                         /   / \  / / / / /__ /  \/ /___  /
  1562. - -----------------------------------------------------------------------------
  1563.  
  1564. +++++++++++++++++++++++++++
  1565.  
  1566. >From willhoek@halcyon.com (Will Parker)
  1567. Date: 8 Nov 1995 21:32:13 GMT
  1568. Organization: Shepard LifeFleet
  1569.  
  1570. In article <47o91i$1m8@nnrp1.news.primenet.com>, english@primenet.com
  1571. (Lawson English) wrote:
  1572.  
  1573. > Point your Web browser to www.info.apple.com (I think). APple just put 
  1574. > out a press release that they are now shipping OpenDoc...
  1575. > The SDK will be available for ftp by November 10.
  1576. > ...
  1577.  
  1578. The same news release states that a CD-ROM version is available on request
  1579. by emailing opendoc@apple.com, in case you have a lazy modem.
  1580.  
  1581. +++++++++++++++++++++++++++
  1582.  
  1583. >From cokenias@mtn-palace.com (Damon Cokenias)
  1584. Date: Sun, 12 Nov 1995 17:13:40 -0800
  1585. Organization: Mountain Palace
  1586.  
  1587. In article <47o91i$1m8@nnrp1.news.primenet.com>, english@primenet.com
  1588. (Lawson English) wrote:
  1589.  
  1590. > Point your Web browser to www.info.apple.com (I think). APple just put 
  1591. > out a press release that they are now shipping OpenDoc...
  1592.  
  1593. The more direct route is www.opendoc.apple.com
  1594.  
  1595. For information about ODF, the OpenDoc Development Framework (a class
  1596. library for building OpenDoc components) check out
  1597. www.opendoc.apple.com/odfmain.html
  1598.  
  1599. -Damon Cokenias
  1600. ODF Team Member
  1601.  
  1602. +-----------------------------------------------------------------------+
  1603. |   /\    Damon Cokenias                                                |
  1604. |  /^^\   cokenias@mtn-palace.com                                       |
  1605. | /____\  Visit the Mountain Palace at http://www.netgate.net/~cokenias |
  1606. +-----------------------------------------------------------------------+
  1607.  
  1608. ---------------------------
  1609.  
  1610. >From zzkbergm@dingo.uq.edu.au (Christoph Bergmann)
  1611. Subject: Pixel doubling speed note!
  1612. Date: Sat, 04 Nov 1995 23:13:23 +1000
  1613. Organization: University of Queensland
  1614.  
  1615. here's an interesting and useful one for ppc pixel doubling routines in C:
  1616.  
  1617. calculate 8 dst pixels at once as two longs. then store them into two
  1618. memory addresses. load them as a double and then store them into the two
  1619. consecutive scan-lines..
  1620.  
  1621. because vram is "slower" (it seems to be anyway) than dram, the fact of
  1622. moving half as many addresses into vram more than makes up for the speed
  1623. lost converting to a float..
  1624. this speeds things up a lot over moving longs into vram.. (on a ppc7100/80
  1625. anyway - might not be so good on a 603?).
  1626.  
  1627. any comments..
  1628. ChrisB.
  1629.  
  1630. +++++++++++++++++++++++++++
  1631.  
  1632. >From gk1@acpub.duke.edu (Gavin Kistner)
  1633. Date: Sat, 04 Nov 1995 16:43:10 -0500
  1634. Organization: Image Refinery Productions, Inc.
  1635.  
  1636. In article <zzkbergm-0411952313230001@zzkbergm.slip.cc.uq.oz.au>,
  1637. zzkbergm@dingo.uq.edu.au (Christoph Bergmann) wrote:
  1638.  
  1639. >here's an interesting and useful one for ppc pixel doubling routines in C:
  1640. [snip]
  1641. >any comments..
  1642.  
  1643. Do you have any numbers comparing the speed for this?
  1644.  
  1645. - Gavin
  1646. ___________________________________________________________
  1647. Gavin Kistner, aka RabYak, aka !Bob          (919) 613-0877
  1648. <-> Graphics Designer, Image Refinery Productions, Inc. <->
  1649. gk1@acpub.duke.edu       ftp/finger to phrogz.dorm.duke.edu
  1650.  
  1651. +++++++++++++++++++++++++++
  1652.  
  1653. >From alexr@apple.com (Alex Rosenberg)
  1654. Date: Mon, 06 Nov 1995 19:27:28 -0800
  1655. Organization: Hackers Anonymous
  1656.  
  1657. In article <zzkbergm-0411952313230001@zzkbergm.slip.cc.uq.oz.au>,
  1658. zzkbergm@dingo.uq.edu.au (Christoph Bergmann) wrote:
  1659.  
  1660. >here's an interesting and useful one for ppc pixel doubling routines in C:
  1661. >
  1662. >calculate 8 dst pixels at once as two longs. then store them into two
  1663. >memory addresses. load them as a double and then store them into the two
  1664. >consecutive scan-lines..
  1665.  
  1666. Solid tip. That's one of the first things we've shown people in the Game
  1667. Kitchens. I'll additionally point out that the doubling routine can make
  1668. use of the rlwimi instruction to perform the byte swizzling. Note that CW7
  1669. doesn't pick up on the ability to use this instruction, so you'll have to
  1670. resort to assembly.
  1671.  
  1672. - -------------------------------------------------------------------------
  1673. -  Alexander M. Rosenberg  - INTERNET: alexr@apple.com      - Yoyodyne    -
  1674. -  330 Waverley St., Apt B - UUCP:ucbvax!apple!alexr        - Propulsion  -
  1675. -  Palo Alto, CA 94301     -                                - Systems     -
  1676. -  (415) 329-8463          - Nobody is my employer so       - :-)         -
  1677. -  (408) 974-3110          - nobody cares what I say.       -             -
  1678.  
  1679. +++++++++++++++++++++++++++
  1680.  
  1681. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  1682. Date: Tue, 07 Nov 1995 06:48:41 -0700
  1683. Organization: BW Software
  1684.  
  1685. In article <alexr-0611951927330001@17.202.12.160>, alexr@apple.com (Alex
  1686. Rosenberg) wrote:
  1687.  
  1688. > In article <zzkbergm-0411952313230001@zzkbergm.slip.cc.uq.oz.au>,
  1689. > zzkbergm@dingo.uq.edu.au (Christoph Bergmann) wrote:
  1690. > >here's an interesting and useful one for ppc pixel doubling routines in C:
  1691. > >
  1692. > >calculate 8 dst pixels at once as two longs. then store them into two
  1693. > >memory addresses. load them as a double and then store them into the two
  1694. > >consecutive scan-lines..
  1695. > Solid tip. That's one of the first things we've shown people in the Game
  1696. > Kitchens. I'll additionally point out that the doubling routine can make
  1697. > use of the rlwimi instruction to perform the byte swizzling. Note that CW7
  1698. > doesn't pick up on the ability to use this instruction, so you'll have to
  1699. > resort to assembly.
  1700.  
  1701.      Speaking of Game Kitchens, where can people find more info on Apple's
  1702. Game Kitchens?  Also, are there any transcripts of what went on there?
  1703.  
  1704. -- 
  1705. "Nothin' like a fried 'nanner sandwich..."
  1706. Eric A. Drumbor      
  1707. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  1708. BW Software
  1709.  
  1710. +++++++++++++++++++++++++++
  1711.  
  1712. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  1713. Date: Tue, 07 Nov 1995 06:59:25 -0700
  1714. Organization: BW Software
  1715.  
  1716. In article <alexr-0611951927330001@17.202.12.160>, alexr@apple.com (Alex
  1717. Rosenberg) wrote:
  1718.  
  1719. [snip]
  1720.  
  1721. > Solid tip. That's one of the first things we've shown people in the Game
  1722. > Kitchens. I'll additionally point out that the doubling routine can make
  1723. > use of the rlwimi instruction to perform the byte swizzling. Note that CW7
  1724. > doesn't pick up on the ability to use this instruction, so you'll have to
  1725. > resort to assembly.
  1726.  
  1727.      Speaking of Game Kitchens, where can people find more info on Apple's
  1728. Game Kitchens?  Also, are there any transcripts of what went on there?
  1729.  
  1730.  
  1731.  
  1732.  
  1733. BTW:  Sorry if this was posted multiple times...my news server is having
  1734. some problems..
  1735.  
  1736. -- 
  1737. "Nothin' like a fried 'nanner sandwich..."
  1738. Eric A. Drumbor      
  1739. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  1740. BW Software
  1741.  
  1742. +++++++++++++++++++++++++++
  1743.  
  1744. >From rbarris@netcom.com (Robert Barris)
  1745. Date: Tue, 7 Nov 1995 08:15:32 GMT
  1746. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1747.  
  1748. In article <alexr-0611951927330001@17.202.12.160>,
  1749. Alex Rosenberg <alexr@apple.com> wrote:
  1750. >In article <zzkbergm-0411952313230001@zzkbergm.slip.cc.uq.oz.au>,
  1751. >zzkbergm@dingo.uq.edu.au (Christoph Bergmann) wrote:
  1752. >
  1753. >>here's an interesting and useful one for ppc pixel doubling routines in C:
  1754. >>
  1755. >>calculate 8 dst pixels at once as two longs. then store them into two
  1756. >>memory addresses. load them as a double and then store them into the two
  1757. >>consecutive scan-lines..
  1758. >
  1759. >Solid tip. That's one of the first things we've shown people in the Game
  1760. >Kitchens. I'll additionally point out that the doubling routine can make
  1761. >use of the rlwimi instruction to perform the byte swizzling. Note that CW7
  1762. >doesn't pick up on the ability to use this instruction, so you'll have to
  1763. >resort to assembly.
  1764.  
  1765. Fortunately CW7 now has an assembler!! ! :)
  1766.  
  1767. As an aside, the key reason this technique works so well is that the writes
  1768. which are done to the temporary 8-byte variable generally don't cause any
  1769. memory traffic - they hit in the L1 cache (at least they do after the 
  1770. first such access) and don't go off-chip (writeback cache is Good). Four
  1771. bytes in from DRAM, 16 bytes out (a pair of doubles), no other external 
  1772. memory traffic if it's done right.
  1773.  
  1774. Rob Barris
  1775. Quicksilver Software Inc.
  1776. rbarris@quicksilver.com
  1777. * Opinions expressed not necessarily those of my employer *
  1778.  
  1779. >From zzkbergm@dingo.uq.edu.au (Christoph Bergmann)
  1780. Subject: Pixel doubling speed note!
  1781. Date: Thu, 09 Nov 1995 22:39:07 +1000
  1782. Organization: University of Queensland
  1783.  
  1784. In article <gk1-0411951643100001@west-111-103.dorm.duke.edu>,
  1785. gk1@acpub.duke.edu (Gavin Kistner) wrote:
  1786.  
  1787. > Do you have any numbers comparing the speed for this?
  1788.  
  1789. yeah..
  1790.  
  1791. on a ppc7100/80 i am getting
  1792.  37 fps using doubles
  1793. and
  1794.  33 fps using longs
  1795.  
  1796. this is a considerable boost considering that my blit routine is taking
  1797. only 30% of the execution time.
  1798.  
  1799. ChrisB.
  1800.  
  1801. +++++++++++++++++++++++++++
  1802.  
  1803. >From ajb@panix.com (Atman Binstock)
  1804. Date: 9 Nov 1995 14:17:37 -0500
  1805. Organization: Panix
  1806.  
  1807. >In article <zzkbergm-0411952313230001@zzkbergm.slip.cc.uq.oz.au>,
  1808. >zzkbergm@dingo.uq.edu.au (Christoph Bergmann) wrote:
  1809. >
  1810. >here's an interesting and useful one for ppc pixel doubling routines in C:
  1811. >
  1812. >calculate 8 dst pixels at once as two longs. then store them into two
  1813. >memory addresses. load them as a double and then store them into the two
  1814. >consecutive scan-lines..
  1815.  
  1816. This only doubles vertically, right???
  1817.  
  1818. Mr. Bergmann says that we start with 8 pixels == 8 bytes == 2 longs, and we 
  1819. get out 2 doubles == 16 bytes == 16 pixels (assuming we are talking 256 
  1820. color mode).
  1821.  
  1822. In article <alexr-0611951927330001@17.202.12.160>,
  1823. Alex Rosenberg <alexr@apple.com> wrote:
  1824. >Solid tip. That's one of 
  1825. the first things we've shown people in the Game
  1826. >Kitchens. I'll additionally point out that the doubling routine can make
  1827. >use of the rlwimi instruction to perform the byte swizzling. Note that CW7
  1828.  
  1829. Why do you need to swizzle bytes?
  1830. Are you using this for horizontal doubling??  How does this work?
  1831.  
  1832. In article <rbarrisDHnyxx.7KJ@netcom.com>,
  1833. Robert Barris <rbarris@netcom.com> wrote:
  1834. >As an aside, the key reason this technique works so well is that the writes
  1835. >which are done to the temporary 8-byte variable generally don't cause any
  1836. >memory traffic - they hit in the L1 cache (at least they do after the 
  1837. >first such access) and don't go off-chip (writeback cache is Good). Four
  1838. >bytes in from DRAM, 16 bytes out (a pair of doubles), no other external 
  1839. >memory traffic if it's done right.
  1840.  
  1841. Here Mr. Barris 4 bytes in 16 bytes out == double doubling.
  1842.  
  1843. Could someone please set me straight about this?
  1844.  
  1845. Thanks,
  1846. Atman Binstock
  1847. ajb@panix.com
  1848.  
  1849.  
  1850.  
  1851. +++++++++++++++++++++++++++
  1852.  
  1853. >From alexr@apple.com (Alex Rosenberg)
  1854. Date: Thu, 09 Nov 1995 18:41:55 -0800
  1855. Organization: Hackers Anonymous
  1856.  
  1857. In article <ericd-0711950648410001@slip17.nilenet.com>,
  1858. ericd@ra.nilenet.com (Eric A. Drumbor) wrote:
  1859.  
  1860. >     Speaking of Game Kitchens, where can people find more info on Apple's
  1861. >Game Kitchens?  Also, are there any transcripts of what went on there?
  1862.  
  1863. There aren't any transcripts because most of the real action takes place
  1864. one-on-one with each developer. If you're a commercial game developer,
  1865. then contact Evangelism to find out how you might get assstance with
  1866. developing your products.
  1867.  
  1868. - -------------------------------------------------------------------
  1869. -  Alexander M. Rosenberg  - INTERNET: alexr@apple.com - Yoyodyne   -
  1870. -  330 Waverley St., Apt B - UUCP:ucbvax!apple!alexr   - Propulsion -
  1871. -  Palo Alto, CA 94301     -                           - Systems    -
  1872. -  (415) 329-8463 (Home)   - Nobody is my employer so  - :-)        -
  1873. -  (408) 974-3110 (Work)   - nobody cares what I say.  -            -
  1874.  
  1875. +++++++++++++++++++++++++++
  1876.  
  1877. >From crudolph@direct.ca (Chris Rudolph)
  1878. Date: Fri, 10 Nov 1995 13:46:53 -0800
  1879. Organization: Motion Works Group Limited
  1880.  
  1881. In article <47tk4h$rm0@panix.com>, ajb@panix.com (Atman Binstock) wrote:
  1882.  
  1883. > >In article <zzkbergm-0411952313230001@zzkbergm.slip.cc.uq.oz.au>,
  1884. > >zzkbergm@dingo.uq.edu.au (Christoph Bergmann) wrote:
  1885. > >
  1886. > >here's an interesting and useful one for ppc pixel doubling routines in C:
  1887. > >
  1888. > >calculate 8 dst pixels at once as two longs. then store them into two
  1889. > >memory addresses. load them as a double and then store them into the two
  1890. > >consecutive scan-lines..
  1891. > This only doubles vertically, right???
  1892. > Mr. Bergmann says that we start with 8 pixels == 8 bytes == 2 longs, and we 
  1893. > get out 2 doubles == 16 bytes == 16 pixels (assuming we are talking 256 
  1894. > color mode).
  1895. > In article <alexr-0611951927330001@17.202.12.160>,
  1896. > Alex Rosenberg <alexr@apple.com> wrote:
  1897. > >Solid tip. That's one of 
  1898. > the first things we've shown people in the Game
  1899. > >Kitchens. I'll additionally point out that the doubling routine can make
  1900. > >use of the rlwimi instruction to perform the byte swizzling. Note that CW7
  1901. > Why do you need to swizzle bytes?
  1902. > Are you using this for horizontal doubling??  How does this work?
  1903.  
  1904. The swizzling is needed to handle the 1x1 -> 2x2 conversion.
  1905. For example, take 4 pixels that you want to double ( 8-bit data )
  1906.  
  1907. AB CD EF 12
  1908.  
  1909. This would pixel double to:
  1910.  
  1911. AB AB CD CD EF EF 12 12
  1912. AB AB CD CD EF EF 12 12
  1913.  
  1914. This is what I wrote to handle pixel doubling. It works quite fast, but if
  1915. anyone out there has better solutions, that would be cool.
  1916.  
  1917. //==============================================================
  1918. //  PixelDouble
  1919. //
  1920. //  This routine doubles pixels for 8-bit data.
  1921. //
  1922. //  inPixels        ->  4 sequential pixels in a scanline.
  1923. //  ioScanline1     ->  Pointer to destination scanline
  1924. //  ioScanline2     ->  Pointer to destination scanline + 1
  1925. //
  1926.  
  1927. asm void PixelDouble( register UInt32 inPixels, 
  1928.                       register UInt32 *ioScanline1,
  1929.                       register UInt32 *ioScanline2 )
  1930. {
  1931.     rlwimi      r0,r3,0,0,7
  1932.     rlwimi      r0,r3,24,8,15
  1933.     rlwimi      r0,r3,24,16,23
  1934.     rlwimi      r0,r3,16,24,31
  1935.     stw         r0,0(r4)
  1936.     stw         r0,0(r5)
  1937.     
  1938.     rlwimi      r0,r3,16,0,7
  1939.     rlwimi      r0,r3,8,8,15
  1940.     rlwimi      r0,r3,8,16,23
  1941.     rlwimi      r0,r3,0,24,31
  1942.     stw         r0,4(r4)
  1943.     stw         r0,4(r5)
  1944.     
  1945.     blr
  1946. }
  1947.  
  1948. Later...
  1949.  
  1950. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1951. Chris Rudolph
  1952. Senior Geek, Technology Works.
  1953. Motion Works Group Limited
  1954.  
  1955. Internet:  crudolph@direct.ca
  1956. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  1957.  
  1958. +++++++++++++++++++++++++++
  1959.  
  1960. >From zzkbergm@dingo.uq.edu.au (Christoph Bergmann)
  1961. Date: Sat, 11 Nov 1995 12:53:34 +1000
  1962. Organization: University of Queensland
  1963.  
  1964. In article <47tk4h$rm0@panix.com>, ajb@panix.com (Atman Binstock) wrote:
  1965.  
  1966. > >here's an interesting and useful one for ppc pixel doubling routines in C:
  1967. > >
  1968. > >calculate 8 dst pixels at once as two longs. then store them into two
  1969. > >memory addresses. load them as a double and then store them into the two
  1970. > >consecutive scan-lines..
  1971. > This only doubles vertically, right???
  1972.  
  1973. by itself, it doubles horizontally. once u have the float though, u can
  1974. append it in two scan-lines at once to double in both directions.
  1975.  
  1976. > Mr. Bergmann says that we start with 8 pixels == 8 bytes == 2 longs, and we 
  1977. > get out 2 doubles == 16 bytes == 16 pixels (assuming we are talking 256 
  1978. > color mode).
  1979.  
  1980. yep. but again, u can easily double this vertically as well.
  1981.  
  1982. how it works:
  1983.  • grab a long input.
  1984.  • individually grab each byte of the input (and)
  1985.  • make copies of each, and shift them all to the appropriate pos (shift)
  1986.  • put them all back together in two longs (or)
  1987.  • store the two longs in memory
  1988.  • load them as a float
  1989.  • store them in VRAM
  1990.  
  1991.  
  1992. > Why do you need to swizzle bytes?
  1993. > Are you using this for horizontal doubling??  How does this work?
  1994.  
  1995. what the instruction he mentioned did was effectively an shift/and/or
  1996. combination.. this beats the seperate shift/and and OR that codewarior
  1997. puts out..
  1998.  
  1999. > >As an aside, the key reason this technique works so well is that the writes
  2000. > >which are done to the temporary 8-byte variable generally don't cause any
  2001. > >memory traffic - they hit in the L1 cache (at least they do after the 
  2002. > >first such access) and don't go off-chip (writeback cache is Good). Four
  2003. > >bytes in from DRAM, 16 bytes out (a pair of doubles), no other external 
  2004. > >memory traffic if it's done right.
  2005.  
  2006. > Here Mr. Barris 4 bytes in 16 bytes out == double doubling.
  2007.  
  2008. he's talking about using it for vertical and horizontal doubling, so there
  2009. is one float out for each scan-line in the pair..
  2010.  
  2011.  
  2012. ChrisB
  2013.  
  2014. +++++++++++++++++++++++++++
  2015.  
  2016. >From jmunkki@beta.hut.fi (Juri Munkki)
  2017. Date: 11 Nov 1995 05:05:58 GMT
  2018. Organization: Helsinki University of Technology
  2019.  
  2020. In article <alexr-0911951841550001@17.202.12.160> alexr@apple.com (Alex Rosenberg) writes:
  2021. >In article <ericd-0711950648410001@slip17.nilenet.com>,
  2022. >ericd@ra.nilenet.com (Eric A. Drumbor) wrote:
  2023. >>     Speaking of Game Kitchens, where can people find more info on Apple's
  2024. >>Game Kitchens?  Also, are there any transcripts of what went on there?
  2025. >
  2026. >There aren't any transcripts because most of the real action takes place
  2027. >one-on-one with each developer. If you're a commercial game developer,
  2028. >then contact Evangelism to find out how you might get assstance with
  2029. >developing your products.
  2030.  
  2031. It would be nice to take part in a kitchen, but I don't think I'll ever
  2032. be able to afford to do it: I already know a few tricks and money is
  2033. tight enough as it is. I seem to remember seeing an invitation for one
  2034. of the games kitchens and it wasn't cheap by any means.
  2035.  
  2036. BTW, is there anything interesting going on in the Cupertino/SF area
  2037. next March? I'll be there for about two weeks and wouldn't mind meeting
  2038. other games programmers.
  2039.  
  2040. -- 
  2041. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  2042. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  2043.  
  2044. +++++++++++++++++++++++++++
  2045.  
  2046. >From albtrssp@crocker.com (Kevin Tieskoetter)
  2047. Date: 11 Nov 1995 15:33:01 GMT
  2048. Organization: Albatross Productions
  2049.  
  2050. In article <alexr-0911951841550001@17.202.12.160>
  2051. alexr@apple.com (Alex Rosenberg) writes:
  2052.  
  2053. > There aren't any transcripts because most of the real action takes place
  2054. > one-on-one with each developer. If you're a commercial game developer,
  2055. > then contact Evangelism to find out how you might get assstance with
  2056. > developing your products.
  2057.  
  2058. The dealings are also confidential - people are baring some of their
  2059. trade secrets at such kitchens, which shouldn't be taken lightly.
  2060.  
  2061. -kevin
  2062.  
  2063. //---------------------------------------------------------------------
  2064.    Kevin Tieskoetter / Software Prestidigitator, Specular International
  2065. //---------------------------------------------------------------------
  2066.  
  2067. +++++++++++++++++++++++++++
  2068.  
  2069. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  2070. Date: 11 Nov 1995 20:44:03 GMT
  2071. Organization: Royal Institute of Technology, Stockholm, Sweden
  2072.  
  2073. In article <crudolph-1011951346530001@van11314.direct.ca> crudolph@direct.ca (Chris Rudolph) writes:
  2074.  
  2075. > asm void PixelDouble( register UInt32 inPixels, 
  2076. >                       register UInt32 *ioScanline1,
  2077. >                       register UInt32 *ioScanline2 )
  2078. > {
  2079. >     rlwimi      r0,r3,0,0,7
  2080. >     rlwimi      r0,r3,24,8,15
  2081. >     rlwimi      r0,r3,24,16,23
  2082. >     rlwimi      r0,r3,16,24,31
  2083. >     stw         r0,0(r4)
  2084. >     stw         r0,0(r5)
  2085. >     
  2086. >     rlwimi      r0,r3,16,0,7
  2087. >     rlwimi      r0,r3,8,8,15
  2088. >     rlwimi      r0,r3,8,16,23
  2089. >     rlwimi      r0,r3,0,24,31
  2090. >     stw         r0,4(r4)
  2091. >     stw         r0,4(r5)
  2092. >     
  2093. >     blr
  2094. > }
  2095.  
  2096. Point 1: the middle two rlwimi instructions in each group can be combined.
  2097. They have the same shift count, and their masks can be merged into one.
  2098.  
  2099.     rlwimi      r0,r3,24,8,15
  2100.     rlwimi      r0,r3,24,16,23
  2101.  
  2102. becomes
  2103.  
  2104.     rlwimi      r0,r3,24,8,23
  2105.  
  2106.  
  2107. Point 2: don't use this for expanding directly to the screen.  Screen
  2108. memory is uncached, so you want to write 64 bits at a time.
  2109.  
  2110.  
  2111. Finally, an actual example: this code expands an entire rectangle.
  2112.  
  2113.  
  2114.  
  2115. asm void twobytwo(
  2116.     register char *dstbase,
  2117.     register u32 dstrowbytes,
  2118.     register char *srcbase,
  2119.     register u32 srcrowbytes,
  2120.     register u32 rows,
  2121.     register u32 words)
  2122. {
  2123. #define srcptr  r9
  2124. #define dstptr1 r10
  2125. #define dstptr2 r11
  2126. #define src     r12
  2127. #define dst1    r30
  2128. #define dst2    r31
  2129. #define dst     fp0
  2130.  
  2131. // check for null rects on paranoid principles
  2132.     cmpwi   rows,0
  2133.     beqlr
  2134.     cmpwi   words,0
  2135.     beqlr
  2136. // we need two nonvolatile registers, so we save them here
  2137.     stw     r30,-8(sp)
  2138.     stw     r31,-4(sp)
  2139. // adjust the pointers for preincrement addressing
  2140.     addi    dstbase,dstbase,-8
  2141.     addi    srcbase,srcbase,-4
  2142. rowloop:
  2143. // set up the source and destination pointers
  2144.     mr      dstptr1,dstbase
  2145.     add     dstptr2,dstbase,dstrowbytes
  2146.     mr      srcptr,srcbase
  2147.     add     srcbase,srcbase,srcrowbytes
  2148.     add     dstbase,dstptr2,dstrowbytes
  2149. // we use the counter register for the inner loop
  2150.     mtctr   words
  2151. wordloop:
  2152. // get four source pixels
  2153.     lwzu    src,4(srcptr)
  2154. // do the horizontal expansion
  2155.     rlwinm  dst1,src,0,0,7
  2156.     rlwinm  dst2,src,0,24,31
  2157.     rlwimi  dst1,src,24,8,23
  2158.     rlwimi  dst2,src,8,8,23
  2159.     rlwimi  dst1,src,16,24,31
  2160.     rlwimi  dst2,src,16,0,7
  2161. // move the expanded pixels into a fp register by way of (cached) memory
  2162.     stw     dst1,-16(sp)
  2163.     stw     dst2,-12(sp)
  2164.     lfd     dst,-16(sp)
  2165. // put sixteen destination pixels
  2166.     stfdu   dst,8(dstptr1)
  2167.     stfdu   dst,8(dstptr2)
  2168. // end of inner loop
  2169.     bdnz    wordloop
  2170. // end of outer loop
  2171.     cmpwi   rows,1
  2172.     addi    rows,rows,-1
  2173.     bne     rowloop
  2174. // we're done.  restore the saved registers and return
  2175.     lwz     r30,-8(sp)
  2176.     lwz     r31,-4(sp)
  2177.     blr
  2178. #undef srcptr
  2179. #undef dstptr1
  2180. #undef dstptr2
  2181. #undef src
  2182. #undef dst1
  2183. #undef dst
  2184. }
  2185.  
  2186.  
  2187. +++++++++++++++++++++++++++
  2188.  
  2189. >From zzkbergm@dingo.uq.edu.au (Christoph Bergmann)
  2190. Date: Sun, 12 Nov 1995 18:22:34 +1000
  2191. Organization: -
  2192.  
  2193. > This is what I wrote to handle pixel doubling. It works quite fast, but if
  2194. > anyone out there has better solutions, that would be cool.
  2195.  
  2196. <snipped code>
  2197.  
  2198.  
  2199. check this:
  2200.  
  2201. it uses less instructions for the 'swizzle' and by using floats it is
  2202. faster at moving memory.. if anyone can do better, please mail me.
  2203.  
  2204.  
  2205.       lwz      r11,dst1    //scanline #1 addr
  2206.       lwz      r12,dst2    // " #2
  2207.       lwz      r3,src      // src scanline addr
  2208.       lwz      r4,srcEnd   // src scanline addr+rowBytes
  2209.       lwz      r5,fff      // a ptr to a float
  2210.       
  2211. loop: lwz      r0,0(r3)
  2212.       addi  r12,r12,8
  2213.        
  2214.       rlwinm   r8,r0,0,0,7
  2215.       rlwimi   r8,r0,16,24,31
  2216.       rlwimi   r8,r0,24,8,23
  2217.       
  2218.       stw     r8,0(r5)
  2219.       
  2220.       rlwinm   r8,r0,0,24,31
  2221.       rlwimi   r8,r0,16,0,7
  2222.       rlwimi   r8,r0,8,8,23
  2223.       
  2224.       stw      r8,4(r5)
  2225.       
  2226.       addi  r11,r11,8
  2227.       lfd      fp0,0(r5)
  2228.       addi  r3,r3,4
  2229.       stfd  fp0,-8(r11)
  2230.       cmplw r3,r4
  2231.       stfd  fp0,-8(r12)
  2232.       
  2233.       blt+  loop
  2234.       
  2235.       frfree;
  2236.       blr
  2237.  
  2238.  
  2239. ChrisB
  2240.  
  2241. +++++++++++++++++++++++++++
  2242.  
  2243. >From meggs@virginia.edu (Andrew Meggs)
  2244. Date: Sun, 12 Nov 1995 17:27:03 GMT
  2245. Organization: University of Virginia
  2246.  
  2247. > //==============================================================
  2248. > //  PixelDouble
  2249. > //
  2250. > //  This routine doubles pixels for 8-bit data.
  2251. > //
  2252. > //  inPixels        ->  4 sequential pixels in a scanline.
  2253. > //  ioScanline1     ->  Pointer to destination scanline
  2254. > //  ioScanline2     ->  Pointer to destination scanline + 1
  2255. > //
  2256. > asm void PixelDouble( register UInt32 inPixels, 
  2257. >                       register UInt32 *ioScanline1,
  2258. >                       register UInt32 *ioScanline2 )
  2259. > {
  2260. >     rlwimi      r0,r3,0,0,7
  2261. >     rlwimi      r0,r3,24,8,15
  2262. >     rlwimi      r0,r3,24,16,23
  2263. >     rlwimi      r0,r3,16,24,31
  2264. >     stw         r0,0(r4)
  2265. >     stw         r0,0(r5)
  2266. >     
  2267. >     rlwimi      r0,r3,16,0,7
  2268. >     rlwimi      r0,r3,8,8,15
  2269. >     rlwimi      r0,r3,8,16,23
  2270. >     rlwimi      r0,r3,0,24,31
  2271. >     stw         r0,4(r4)
  2272. >     stw         r0,4(r5)
  2273. >     
  2274. >     blr
  2275. > }
  2276.  
  2277. How does my version look from a performance standpoint?
  2278.    
  2279.    lwzu     r3,4(input_buffer)
  2280.  
  2281. //   some stuff to avoid pipeline stalls
  2282.  
  2283.    mr       r0,r3
  2284.    rlwimi   r0,r0,16,16,31
  2285.    rlwimi   r3,r3,16,0,15
  2286.    rlwimi   r0,r0,8,8,23
  2287.    rlwimi   r3,r3,8,8,23
  2288.    stw      r3,0(tempbuf)
  2289.    stw      r0,4(tempbuf)
  2290.  
  2291. //    would I benefit from some instructions here or is a stall not a problem?
  2292.  
  2293.    lfd      fp0,0(tempbuf)
  2294.  
  2295. //    would I benefit from some instructions here or is a stall not a problem?
  2296.  
  2297.    stfdu    fp0,8(output_line1)
  2298.    stfdu    fp0,8(output_line2)
  2299.  
  2300. The basic difference is that the 8 rlwimi's become an mr and 5 rlwimi's. And
  2301. I've put in a first version of the double moving technique, but I'm not
  2302. sure about the performance characteristics of all those loads and stores
  2303. right next to each other.
  2304.  
  2305. -- 
  2306. _________________________________________________________________________
  2307. andrew meggs                                 people who sleep really suck
  2308. meggs@virginia.edu                http://darwin.clas.virginia.edu/~apm3g/
  2309.  
  2310. +++++++++++++++++++++++++++
  2311.  
  2312. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  2313. Date: 12 Nov 1995 18:53:33 GMT
  2314. Organization: Royal Institute of Technology, Stockholm, Sweden
  2315.  
  2316. In article <meggs-1211951227030001@bootp-188-82.bootp.virginia.edu> meggs@virginia.edu (Andrew Meggs) writes:
  2317. > And I've put in a first version of the double moving technique, but I'm
  2318. > not sure about the performance characteristics of all those loads and
  2319. > stores right next to each other.
  2320.  
  2321. It doesn't matter in the least as long as you're outputting to screen
  2322. memory, since the uncached writes take all the time anyway.  Fortunately,
  2323. there's a write queue to smooth out the bumps.
  2324.  
  2325.  
  2326. /Bo Lindbergh
  2327.  
  2328. +++++++++++++++++++++++++++
  2329.  
  2330. >From jmunkki@beta.hut.fi (Juri Munkki)
  2331. Date: 13 Nov 1995 02:24:06 GMT
  2332. Organization: Helsinki University of Technology
  2333.  
  2334. In article <meggs-1211951227030001@bootp-188-82.bootp.virginia.edu> meggs@virginia.edu (Andrew Meggs) writes:
  2335. >How does my version look from a performance standpoint?
  2336.  
  2337. I don't know...I don't even have a PowerMac, but I do have a suggestion.
  2338.  
  2339. >The basic difference is that the 8 rlwimi's become an mr and 5 rlwimi's. And
  2340. >I've put in a first version of the double moving technique, but I'm not
  2341. >sure about the performance characteristics of all those loads and stores
  2342. >right next to each other.
  2343.  
  2344. What you should do is interleave the code for two pixel doubling sequences.
  2345.  
  2346. What you have now is:
  2347.  
  2348.         load undoubled data
  2349.         shuffle bytes around
  2350.         store to temporary storage
  2351.         read it into a floating point register
  2352.         store fp to video
  2353.  
  2354. What you could do is:
  2355.  
  2356.         load first undoubled data               
  2357.         shuffle bytes around                    load second undoubled data
  2358. @loop
  2359.         store first bytes to temporary storage  shuffle second undoubled data
  2360.         load temp to fp register                keep shuffling
  2361.         store fp registers to video             store second bytes to temp
  2362.         load new data to first registers        load fp registers
  2363.         shuffle bytes around                    store fp to video
  2364.         keep shuffling                          load second undoubled data
  2365.         goto loop, if you aren't done yet
  2366.  
  2367. By mixing interleaving independent instructions to the maximum, you
  2368. might be able to double the speed of the doubling loop under optimal
  2369. conditions. Video memory speed is probably a more severe limiting
  2370. factor anyway.
  2371.  
  2372. I think you will stall after the mr and the lfd, because they are followed
  2373. immediately by instructions that need the result of the move. That means
  2374. that if you do something unrelated in between, you can use the cycles
  2375. that would otherwise be stalled.
  2376.  
  2377. Not ever having had the pleasure to program the PowerPC in asm, this is all
  2378. from theory (I only have the Motorola/IBM 601 User's Manual). I tend to do
  2379. stuff like this even with the 68K...I think the 040 is somewhat pipelined
  2380. and it usually doesn't hurt.
  2381.  
  2382. I guess a good rule is that if you are doing something with memory, it's
  2383. usually possible to pipeline the next instruction if it is not related
  2384. to what you were loading from memory.
  2385.  
  2386. I hope this makes sense. It's sometimes hard to understand a processor that
  2387. sometimes runs code faster when it contains extra NOP instructions... (I would
  2388. tend to think that running faster with NOPs wouldn't be something you could
  2389. rely on from processor type to processor type even within the same family.)
  2390.  
  2391. -- 
  2392. Juri Munkki jmunkki@iki.fi      There ain't no such thing as a shareware lunch.
  2393. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  2394.  
  2395. ---------------------------
  2396.  
  2397. >From jwbaxter@olympus.net (John W. Baxter)
  2398. Subject: Std Template Library Book
  2399. Date: Sat, 11 Nov 1995 16:40:47 -0800
  2400. Organization: Townsend Communications
  2401.  
  2402. "C++ Programmer's Guide to the Standard Template Library" by Mark Nelson
  2403. was on the shelf at University Bookstore in Seattle today (11/11).  One
  2404. copy which was there has crossed the Sound and is now here.
  2405.  
  2406.    Pre-reading review:   1 5/8 inches of book; $49.99.
  2407.  
  2408.    That's a much better per-book-inch rate than the K&R C second edition. 
  2409. But not as good as IM: AOCE Application Interface.
  2410.  
  2411.     Seriously...a quick thumb-through suggests this is a useful book about
  2412. STL (which is a useful part of the Draft Standard).
  2413.  
  2414.     --John
  2415.  
  2416. -- 
  2417.   "This item is not available because it cannot be removed."
  2418. John W. Baxter    Port Ludlow, WA     jwbaxter@olympus.net
  2419.  
  2420. ---------------------------
  2421.  
  2422. >From cmsngr@aol.com (CMSngr)
  2423. Subject: VBL Syncing Solution and problems.
  2424. Date: 15 Nov 1995 09:54:56 -0500
  2425. Organization: America Online, Inc. (1-800-827-6364)
  2426.  
  2427.  
  2428. Hi!
  2429.  
  2430.  So, someone posted something the other day talking about 
  2431. avoiding "tearing" in a display routine. Whoever this evil 
  2432. person was set the concept in my mind (I was having tearing
  2433. problems) so I wrote the following. The public entry point
  2434. is called bmSync() and basically the call blocks until the
  2435. retrace manager says we are between refreshes. Forgive any
  2436. idiocy in the code, I didn't even know what the VBL manager
  2437. was until last night. The Mac's just this hobby you know?
  2438.  
  2439.     It seems to work. That having been said, there are two 
  2440. problems. First, when I attempt to profile an executable
  2441. which calls the bmSync routine with the MW profiler, I get
  2442. the following: ASSERT: localStackTop <= globals->threadsStack
  2443. ->frameBuffer && [... blah blah blah ...] profiler.c: 1476
  2444. Second, the last commented out line in bmDestroyVBLTask always
  2445. fails when uncommented. The return code is -1 which (according
  2446. to the processes manual) means that the queue was not found.
  2447. Should this worry me? What am I doing wrong. Whassup with
  2448. the MW profiler?
  2449.  
  2450.     So, here it is. One should feel free to use the code as 
  2451. one sees fit. It is far from the best code I've ever written.
  2452. One note of explanation is that I guarentee that any given 
  2453. window is fully on one device and I put the GDHandle of that 
  2454. device in the window user ref for use in the bmSync routine.
  2455.  
  2456. Anyway,
  2457. -Chris
  2458.  
  2459. PS: The mind boggles at what the damned AOL news reader may 
  2460. do to this. Sorry if it comes out illegible.
  2461.  
  2462. /*
  2463.  bmapsync.c  (c) Christopher M. Songer 1995
  2464.      All Rights Reserved
  2465.      
  2466.  Overview: Provides support for the bmSync call which blocks until 
  2467.      an opportune moment for screen drawing.
  2468.  
  2469. */
  2470.  
  2471. #include "bmap.h"
  2472. #include "dbg.h"
  2473. #include <Retrace.h>
  2474.  
  2475.  
  2476. #define SyncImpossible  0x00000001
  2477. #define SyncPossible 0x00000002
  2478.  
  2479. typedef struct _t_SyncVBLTask SyncVBLTask;
  2480. struct _t_SyncVBLTask
  2481. {
  2482.  struct VBLTask task; // the retrace task control block.
  2483.  unsigned int *ptr;  // pointer to the data for the task to use.
  2484. };
  2485.  
  2486. static pascal void bmVBLTask(
  2487.  VBLTaskPtr task
  2488. )
  2489. /*
  2490.  Purpose: Set the retrace is safe flag.
  2491.  
  2492.  Returns: nothing.
  2493.  
  2494.  Who: songer
  2495. */
  2496. {
  2497.  **((unsigned int **)(task + 1)) = 1;
  2498. }
  2499.  
  2500.  
  2501. SyncVBLTask taskblock;
  2502. static int bmCreateVBLTask( 
  2503.  GDHandle device,   // input window pointer.
  2504.  unsigned int *ptr,  // input data pointer.
  2505.  short *slotout   // output slot number
  2506. )
  2507. /*
  2508.  Purpose: Installs the VLB task for use on the preferred monitor if 
  2509.     possible.
  2510.     
  2511.  Returns: SyncImpossible if VLBTask cannot be installed.
  2512.     SyncPossible is VLB task was sucessfully installed.
  2513.  
  2514.  Who: songer
  2515. */
  2516. {
  2517.  AuxDCEHandle whoknows;
  2518.  short slot;
  2519.  short devref;
  2520.  OSErr err;
  2521.  
  2522.  taskblock.task.vblAddr = NewVBLProc( bmVBLTask );
  2523.  taskblock.task.qType = vType;
  2524.  taskblock.task.vblCount = 1;
  2525.  taskblock.task.vblPhase = 0;
  2526.  taskblock.ptr = ptr;
  2527.  
  2528.  devref = (**device).gdRefNum;
  2529.  whoknows = (AuxDCEHandle)(GetDCtlEntry( devref ));
  2530.  slot = (**whoknows).dCtlSlot;
  2531.  *slotout = slot;
  2532.  
  2533.  err = SlotVInstall( (QElemPtr)&taskblock.task, slot );
  2534.  ASSERT( err == 0 ); 
  2535.  
  2536.  return SyncPossible;
  2537. }
  2538.  
  2539.  
  2540. static void bmDestroyVBLTask(
  2541.  short slot  // input slot number
  2542. )
  2543. /*
  2544.  Purpose: Removes the VBL task from the queue of slot.
  2545.  
  2546.  Returns: nothing.
  2547.  
  2548.  Who: songer
  2549. */
  2550. {
  2551.  OSErr err;
  2552.  
  2553.  err = SlotVRemove( (QElemPtr)&taskblock.task, slot );
  2554.  //ASSERT( err == 0 );
  2555. }
  2556.  
  2557.  
  2558. void bmSync( 
  2559.  BMap *bmap  // input bmap pointer.
  2560. )
  2561. /*
  2562.  Purpose: Waits for a moment when blitting to a monitor will not cause 
  2563.    "tearing"
  2564.  
  2565.  Returns: nothing
  2566.  
  2567.  Who: songer
  2568. */
  2569. {
  2570.  volatile unsigned int bmSyncSafe;
  2571.  GDHandle device;
  2572.  WindowPtr window;
  2573.  short slot;
  2574.  
  2575.  ASSERT( bmap->type == BmapWindow );
  2576.  
  2577.  window = bmap->bmapdata;
  2578.  device = (GDHandle)GetWRefCon( window );
  2579.  if( device )
  2580.  {
  2581.   bmSyncSafe = 0;
  2582.   if( bmCreateVBLTask( device, &bmSyncSafe, &slot ) == SyncPossible )
  2583.   {
  2584.    while( !bmSyncSafe )
  2585.    {
  2586.     ;  // no warnings
  2587.    }
  2588.    
  2589.    bmDestroyVBLTask( slot );
  2590.   }
  2591.  } 
  2592. }
  2593.  
  2594. ---------------------------
  2595.  
  2596. >From meir@zoology.washington.edu (Eli Meir)
  2597. Subject: Where to put temp files?
  2598. Date: 26 Oct 1995 21:14:42 GMT
  2599. Organization: Dept. of Zoology, Univ. of Washington
  2600.  
  2601. I am writing a program that creates temporary files as it runs.  I put
  2602. these files into the same directory as the program itself.  Some of my
  2603. beta-testers have told me that this is a problem when using At Ease, or
  2604. when running off of protected networks.  Where should I put temporary
  2605. files so that they are safe on any machine (they are in the 100's of KB
  2606. range)?  Is there some official place in the system folder or
  2607. something, and if so, what commands do I use to find that place?
  2608.  
  2609. Thanks very much in advance.
  2610.  
  2611. Eli Meir
  2612. Dept of Zoology, Univ of Washington
  2613. meir@zoology.washington.edu
  2614.  
  2615. +++++++++++++++++++++++++++
  2616.  
  2617. >From mclow@coyote.csusm.edu (Marshall Clow)
  2618. Date: Thu, 26 Oct 1995 14:55:36 -0700
  2619. Organization: Aladdin Systems
  2620.  
  2621. In article <46oto2$fci@nntp5.u.washington.edu>,
  2622. meir@zoology.washington.edu (Eli Meir) wrote:
  2623.  
  2624. >I am writing a program that creates temporary files as it runs.  I put
  2625. >these files into the same directory as the program itself.  Some of my
  2626. >beta-testers have told me that this is a problem when using At Ease, or
  2627. >when running off of protected networks.  Where should I put temporary
  2628. >files so that they are safe on any machine (they are in the 100's of KB
  2629. >range)?  Is there some official place in the system folder or
  2630. >something, and if so, what commands do I use to find that place?
  2631. >
  2632. >
  2633. Use the routine FindFolder to locate the "temporary items folder"
  2634. on the volume that the application is running on.
  2635.  
  2636. If the folder cannot be created or is not writeable, then use FindFolder
  2637. to locate the the "temporary items folder" on the system volume.
  2638.  
  2639. If the folder cannot be created or is not writeable, give up :-)
  2640.  
  2641. Look in the header file, "Folders.h", or in NIM:Mac Toolbox Essentials, pp 7.54
  2642. for a description of FindFolder.
  2643. -- Marshall
  2644.  
  2645. -- 
  2646. "They that can give up essential liberty to obtain a little temporary
  2647.  safety deserve neither liberty nor safety." -- Benjamin Franklin
  2648.  _Historical Review of Pennsylvania_, 1759
  2649.  
  2650. +++++++++++++++++++++++++++
  2651.  
  2652. >From Dave Overton <doverton@iglou.com>
  2653. Date: Fri, 27 Oct 1995 17:26:30 GMT
  2654. Organization: DataStream Imaging Systems, Inc.
  2655.  
  2656.  
  2657. IMHO, let the user choose and set a preference. Particularly if the files
  2658. are large, they may want to put
  2659. them on another drive with more free space. Check PhotoShop's swap file
  2660. for example.
  2661. Dave Overton
  2662.  
  2663. +++++++++++++++++++++++++++
  2664.  
  2665. >From samny@nyc.pipeline.com (Ed Samuels)
  2666. Date: 28 Oct 1995 13:11:40 -0400
  2667. Organization: The Pipeline
  2668.  
  2669. In article <46oto2$fci@nntp5.u.washington.edu>, Eli Meir writes: 
  2670.  
  2671. >I am writing a program that creates temporary files as it runs.  I put 
  2672. >these files into the same directory as the program itself.  Some of my 
  2673. >beta-testers have told me that this is a problem when using At Ease, or 
  2674. >when running off of protected networks.  Where should I put temporary 
  2675. >files so that they are safe on any machine (they are in the 100's of KB 
  2676. >range)?  Is there some official place in the system folder or 
  2677. >something, and if so, what commands do I use to find that place? 
  2678.  
  2679.     All temporary files should be stored in the "Temporary Items" folder on
  2680. the root level of the system disk--don't try to look for it, though,
  2681. because it's invisible. The only evidence a normal user has that it's there
  2682. is that if there are still files in that folder upon startup--if, for
  2683. instance, the system crashes while a temporary file is in it--the Finder
  2684. puts it into a "Rescued Items" folder inside of the Trash. 
  2685.     To find the Temporary Items folder in your application, call the
  2686. toolbox function FindFolder: 
  2687.      
  2688. Pascal:    function FindFolder (vRefNum: integer; folderType: OSType;
  2689. createFolder: Boolean; var foundVRefNum:integer; var foundDirID: longint):
  2690. OSErr; 
  2691.  
  2692. C:         OSErr FindFolder (short vRefNum, OSType folderType, Boolean
  2693. createFolder, short* foundVRefNum, long* foundDirID); 
  2694.  
  2695.     FindFolder can find just about any of the important folders used by the
  2696. system, such as the system folder, the trash, or the temporary items
  2697. folder. To find the temporary items folder, use it this way (example in
  2698. Pascal): 
  2699.  
  2700.     err := FindFolder (kOnSystemDisk, kTemporaryFolderType, true,
  2701. itsVRefNum, itsDirID); 
  2702.  
  2703.     kOnSystemDisk means that you want to look for the folder on the current
  2704. startup disk; kTemporaryFolderType is a global constant, the value of which
  2705. is 'temp', a 4-letter code representing the temporary items folder; true
  2706. means that you want to create the folder if it doesn't exist, and
  2707. itsVRefNum and itsDirID are variables that you use to store the volume
  2708. number and directory of the folder in question. When you create the FSSpec
  2709. of your temp file, use this volume number and directory to put the temp
  2710. file into the proper directory. 
  2711.  
  2712.  
  2713. ___________________________________ 
  2714. Richard Samuels                :-) 
  2715. samny@nyc.pipeline.com
  2716.  
  2717. +++++++++++++++++++++++++++
  2718.  
  2719. >From samny@nyc.pipeline.com (Ed Samuels)
  2720. Date: 28 Oct 1995 19:43:00 -0400
  2721. Organization: The Pipeline
  2722.  
  2723.  All temporary files should be stored in the "Temporary Items" folder on
  2724. the root level of the system disk--don't try to look for it, though,
  2725. because it's invisible. The only evidence a normal user has that it's there
  2726. is that if there are still files in that folder upon startup--if, for
  2727. instance, the system crashes while a temporary file is in it--the Finder
  2728. puts it into a "Rescued Items" folder inside of the Trash. 
  2729.  To find the Temporary Items folder in your application, call the toolbox
  2730. function FindFolder: 
  2731.   
  2732. Pascal: function FindFolder (vRefNum: integer; folderType: OSType;
  2733. createFolder: Boolean; var foundVRefNum:integer; var foundDirID: longint); 
  2734.  
  2735. C: OSErr FindFolder (short vRefNum, OSType folderType, Boolean
  2736. createFolder, short* foundVRefNum, long* foundDirID); 
  2737.    
  2738.  FindFolder can find the System Folder, any folder inside of it, or just
  2739. about any of the important folders used by the system, such as the system
  2740. folder, the trash, or the temporary items folder. To find the temporary
  2741. items folder, use it this way (example in Pascal): 
  2742.  
  2743.  err := FindFolder (kOnSystemDisk, kTemporaryFolderType, true, itsVRefNum,
  2744. itsDirID); 
  2745.  
  2746.  kOnSystemDisk means that you want to look for the folder on the current
  2747. startup disk; kTemporaryFolderType is a global constant, the value of which
  2748. is 'temp', a 4-letter code representing the temporary items folder; true
  2749. means that you want to create the folder if it doesn't exist, and
  2750. itsVRefNum and itsDirID are variables that you use to store the volume
  2751. number and directory of the folder in question. When you create the FSSpec
  2752. of your temp file, use this volume number and directory to put the temp
  2753. file into the proper directory. 
  2754.  
  2755. ___________________________________ 
  2756. Richard Samuels 
  2757. samny@nyc.pipeline.com
  2758.  
  2759. +++++++++++++++++++++++++++
  2760.  
  2761. >From tulip@tiac.net (Ed Anson)
  2762. Date: Sun, 29 Oct 1995 21:00:12 -0500
  2763. Organization: Tulip Software
  2764.  
  2765. In article <46uf64$ova@pipe4.nyc.pipeline.com>, samny@nyc.pipeline.com (Ed
  2766. Samuels) wrote:
  2767.  
  2768. >  All temporary files should be stored in the "Temporary Items" folder on
  2769. > the root level of the system disk--don't try to look for it, though,
  2770.  
  2771. Please don't always put it on the system disk. I know a lot of
  2772. applications do that, and it drives me crazy. I (for one) prefer to
  2773. reserve my system disk for system stuff, and I don't leave a lot of empty
  2774. space on it for temporary files. Those apps that insist on using the
  2775. system disk for temporary files generally fail.
  2776.  
  2777. There is a "Temporary Items" folder on every volume. If the user is
  2778. creating or using documents associated with the temporary data, a good
  2779. rule of thumb is to use the same volume for temporary files. All my apps
  2780. do that, and it works out well.
  2781.  
  2782. - --------------------
  2783. Ed Anson            MediaTree: multimedia outline editor & catalog
  2784. Tulip Software
  2785. Andover, MA 01810   For details, check out my WWW page:
  2786. U.S.A.              <http://www.tiac.net/users/tulip/home.html>
  2787.  
  2788. +++++++++++++++++++++++++++
  2789.  
  2790. >From meir@zoology.washington.edu (Eli Meir)
  2791. Date: 30 Oct 1995 05:36:33 GMT
  2792. Organization: Dept. of Zoology, Univ. of Washington
  2793.  
  2794. Thanks to everyone for your help.  Putting stuff in the temporary
  2795. folder seems to work.
  2796.  
  2797. Eli Meir
  2798. Dept of Zoology, Univ of Washington
  2799. meir@zoology.washington.edu
  2800.  
  2801. +++++++++++++++++++++++++++
  2802.  
  2803. >From Alex Rosen <alex@procd.com>
  2804. Date: 30 Oct 1995 21:51:27 GMT
  2805. Organization: Pro CD, Inc.
  2806.  
  2807. In article <tulip-2910952100120001@tulip.tiac.net> Ed Anson,
  2808. tulip@tiac.net writes:
  2809. >There is a "Temporary Items" folder on every volume. If the user is
  2810. >creating or using documents associated with the temporary data, a good
  2811. >rule of thumb is to use the same volume for temporary files. All my apps
  2812. >do that, and it works out well.
  2813.  
  2814. This sounds like a good rule, as long as you check for floppies,
  2815. read-only directories, and available disk space.
  2816.  
  2817. --Alex
  2818.  
  2819. +++++++++++++++++++++++++++
  2820.  
  2821. >From jumplong@aol.com (Jump Long)
  2822. Date: 2 Nov 1995 23:14:53 -0500
  2823. Organization: America Online, Inc. (1-800-827-6364)
  2824.  
  2825. In article <tulip-2910952100120001@tulip.tiac.net> Ed Anson,
  2826. tulip@tiac.net writes:
  2827. >There is a "Temporary Items" folder on every volume. If the user is
  2828. >creating or using documents associated with the temporary data, a good
  2829. >rule of thumb is to use the same volume for temporary files. All my apps
  2830. >do that, and it works out well.
  2831.  
  2832. Another rule you should follow is that once you create a temporary file in
  2833. the Temporary Items folder, you should open the file and keep it open.
  2834. Here's why:
  2835.  
  2836. There's a bug in the Finder that can cause files in the Temporary Items
  2837. folder to be deleted if the volume is shared with AppleShare server or
  2838. File Sharing. The way to prevent that from happening to your files in the
  2839. Temporary Items folder is to open the files and keep them open. Open files
  2840. cannot be deleted. Another advantage of keeping your files in the
  2841. Temporary Items folder open is that when it is time to delete them, you
  2842. can always find them - just use the GetFileLocation function in MoreFiles
  2843. to get the open file's current location.
  2844.  
  2845. Jim Luther
  2846. Former keeper of File Manager knowledge...
  2847.  
  2848. +++++++++++++++++++++++++++
  2849.  
  2850. >From mnoble@jyacc.com (Mike Noble)
  2851. Date: Fri, 3 Nov 1995 15:10:47 GMT
  2852. Organization: JYACC
  2853.  
  2854. > Ed Anson writes:
  2855. >
  2856. >There is a "Temporary Items" folder on every volume. 
  2857.  
  2858. This is not 100% true.  I am a client/server tools developer, and
  2859. throughout the development and QA cycle we build applications and
  2860. then store them, write protected, on some kind of centralized server, 
  2861. which is in most cases is accessed via either a UNIX/NFS or Novell
  2862. mounted volume.  By default these volumes do not contain a
  2863. "Temporary Items" folder.
  2864.  
  2865. Mike Noble
  2866. JAM for Macintosh Product Development,  JYACC, Inc.
  2867.  
  2868.  
  2869. +++++++++++++++++++++++++++
  2870.  
  2871. >From tulip@tiac.net (Ed Anson)
  2872. Date: Sat, 04 Nov 1995 12:41:49 -0500
  2873. Organization: Tulip Software
  2874.  
  2875. In article <47c4vt$5b1@newsbf02.news.aol.com>, jumplong@aol.com (Jump
  2876. Long) wrote:
  2877.  
  2878. > In article <tulip-2910952100120001@tulip.tiac.net> Ed Anson,
  2879. > tulip@tiac.net writes:
  2880. > >There is a "Temporary Items" folder on every volume. If the user is
  2881. > >creating or using documents associated with the temporary data, a good
  2882. > >rule of thumb is to use the same volume for temporary files. All my apps
  2883. > >do that, and it works out well.
  2884. > Another rule you should follow is that once you create a temporary file in
  2885. > the Temporary Items folder, you should open the file and keep it open.
  2886. > Here's why:
  2887.    [details deleted]
  2888.  
  2889. That's interesting information, and probably a good idea in general.
  2890.  
  2891. OTOH: In an application I'm currently working on, I wind up creating a
  2892. large number of temporary files. The actual number is undetermined and
  2893. essentially unlimited. I suspect that keeping all of them open (I only
  2894. need one or two at a time) would place undue strain on system resources.
  2895.  
  2896. What are your thoughts on this?
  2897.  
  2898. - --------------------
  2899. Ed Anson
  2900. Tulip Software
  2901. Andover, MA 01810   Check out my WWW page:
  2902. U.S.A.              <http://www.tiac.net/users/tulip/home.html>
  2903.  
  2904. +++++++++++++++++++++++++++
  2905.  
  2906. >From jumplong@aol.com (Jump Long)
  2907. Date: 14 Nov 1995 04:31:14 -0500
  2908. Organization: America Online, Inc. (1-800-827-6364)
  2909.  
  2910. Ed Anson wrote:
  2911. >OTOH: In an application I'm currently working on, I wind up
  2912. >creating a large number of temporary files. The actual number is
  2913. >undetermined and essentially unlimited. I suspect that keeping
  2914. >all of them open (I only need one or two at a time) would place
  2915. >undue strain on system resources.
  2916. >
  2917. >What are your thoughts on this?
  2918.  
  2919. I answered this through email... the shortened answer is:
  2920.  
  2921. If you need lots of temporary files and don't want to keep them open, just
  2922. create a folder in the Temporary Items folder and put your files there.
  2923. Since  your sub-folder's directory ID won't change, if anything moves your
  2924. folder, you'll still be able to find it.
  2925.  
  2926. - Jim Luther
  2927.  
  2928. ---------------------------
  2929.  
  2930. >From hamm0059@gold.tc.umn.edu (Kyle Hammond)
  2931. Subject: [Q] Volume type information available?
  2932. Date: Wed, 8 Nov 1995 15:18:18 GMT
  2933. Organization: University of Minnesota
  2934.  
  2935. Hi all,
  2936.  
  2937. I am writing some code to check all mounted volumes for their type and size.
  2938. Currently I use the call PBHGetVInfoSync() and run through the index
  2939. until I get an error, as described in THINK Reference.  I have a few
  2940. questions about this method however:
  2941.  
  2942. a) There does not seem to be any field that tells whether the volume is an
  2943. Appleshare volume (on a remote computer).  Currently I check the ioVFSID
  2944. field for a non-zero value.  This isn't quite what I want however, since DOS
  2945. formatted disks and audio CDs have a non-zero ioVFSID also.  Is there
  2946. some other call or field I should look at?
  2947.  
  2948. b) The PBHGetVInfoSync() call crashes the system on a Quadra that I tested
  2949. it on.  Is there some Gestalt or other call to check if the PBH calls are
  2950. available?  And if they're not available how do I check on the volumes?
  2951.  
  2952. c) How can I tell if a volume is a CD-ROM, floppy or other removable media?
  2953. I would prefer to stay away from SCSI Manager calls if possible.  For floppys
  2954. I currently check the ioVDrvInfo field for a value of 1, but it is
  2955. possible to connect an external floppy drive that would have another
  2956. ioVDrvInfo value (although I haven't seen an external floppy drive for a
  2957. long time).
  2958.  
  2959. Any and all information pertaining to volume information would be greatly
  2960. appreciated.  I have read through everything related to volumes in THINK
  2961. Reference; my CD-ROM version of Inside Macintosh is copyright 1995 but
  2962. does not even have the PB... calls documented (that I could find)!
  2963.  
  2964. Thanks in advance,
  2965. Kyle Hammond
  2966. hamm0059@gold.tc.umn.edu
  2967. University of Minnesota
  2968.  
  2969. +++++++++++++++++++++++++++
  2970.  
  2971. >From axlrosen@tiac.net (Alex Rosen)
  2972. Date: Mon, 13 Nov 1995 23:32:37 -0500
  2973. Organization: The Internet Access Company
  2974.  
  2975. How to detect a CD-ROM drive: 
  2976. http://dev.info.apple.com/techqa/devices/dev18.html#RTFToC18
  2977.  
  2978. How to detect an AppleShare volume:
  2979. http://dev.info.apple.com/techqa/files/files01.html#RTFToC1
  2980.  
  2981. --Alex
  2982.  
  2983. +++++++++++++++++++++++++++
  2984.  
  2985. >From m_weinstein@msn.com (Mark Weinstein)
  2986. Date: 15 Nov 95 22:42:04 -0800
  2987. Organization: The Microsoft Network (msn.com)
  2988.  
  2989. >b) The PBHGetVInfoSync() call crashes the system on a Quadra that  
  2990. >tested it on.  Is there some Gestalt or other call to check if the 
  2991. >PBH calls are available?  And if they're not available how do I 
  2992. >check on the volumes?
  2993.  
  2994. NO, dude, you don't need to check for that call at all in _Gestalt.  
  2995. In fact, I bet a billion dollars that you are simply using the wrong 
  2996. parameter block; this is the most common error when using that 
  2997. function, and it will cause your system to crash.  Here is how you 
  2998. can call it:
  2999.  
  3000. void get_vol_info( short vRefNum )
  3001. {
  3002.    HVolumeParam pb;
  3003.  
  3004.    memset( ( void * )&pb, 0, sizeof( pb ) ); 
  3005.    pb.ioVRefNum = vRefNum;
  3006.    return( PBHGetVInfoSync( &pb ) );  //may have to typcast, etc..
  3007. }
  3008.  
  3009. The crucial thing to check w/ your code is the PARAMETER BLOCK you 
  3010. are using.  If you use a "VolumeParam" and call that function, your 
  3011. system will crash; the "HVolumeParam"is actually a much larger 
  3012. structure than VolumeParam, and its the right one to use for that 
  3013. function.  If you use VolumeParam, you will probably trash values on 
  3014. your stack, including return addresses from functions you are calling.
  3015.  
  3016. Tell me if this works.  MRW.
  3017.  
  3018. ---------------------------
  3019.  
  3020. >From mtrent@msn.fullfeed.com (Michael Trent)
  3021. Subject: [Q] _PrimeTime crashes?
  3022. Date: Mon, 13 Nov 1995 08:45:44 -0500
  3023. Organization: FullFeed Madison (newsmaster@msn.fullfeed.com)
  3024.  
  3025. Here's a question for the MacsBug people. I'm posting it to
  3026. c.s.m.programmer.help because it seems like the kind of question a
  3027. programmer can answer best.
  3028.  
  3029. I've been experiencing a lot of problems with hanging at the _PrimeTime
  3030. trap. The computer suddenly freezes, cursor and all. If I press the
  3031. interrupt key and drop into MacsBug, it tells me I'm in _PrimeTime. If I
  3032. 'g'o, everything resumes as normal. It's like _PrimeTime just needed a
  3033. little push.
  3034.  
  3035. This kind of thing only used to happen in some computer games
  3036. (SuperWingCommander, MacDoom), but lately it has been happening all the
  3037. time.
  3038.  
  3039. I'm not a MacsBug expert. I was wondering if someone doesn't know what
  3040. might be causing me to hang at _PrimeTime of hand, maybe someone could
  3041. tell me how I could track down the culprit using MacsBug?
  3042.  
  3043. Thanks for all your help! I'm really stumped here.
  3044.  
  3045. MDT
  3046. mtrent@msn.fullfeed.com
  3047.  
  3048. -- 
  3049. >>SIG UNDER CONSTRUCTION<<
  3050.  
  3051. +++++++++++++++++++++++++++
  3052.  
  3053. >From kamprat@leonardo.net (Michael F. Kamprath)
  3054. Date: Mon, 13 Nov 1995 09:45:10 -0800
  3055. Organization: <none at all>
  3056.  
  3057. In article <mtrent-1311950845440001@azathoth.msn.fullfeed.com>,
  3058. mtrent@msn.fullfeed.com (Michael Trent) wrote:
  3059.  
  3060. > Here's a question for the MacsBug people. I'm posting it to
  3061. > c.s.m.programmer.help because it seems like the kind of question a
  3062. > programmer can answer best.
  3063. > I've been experiencing a lot of problems with hanging at the _PrimeTime
  3064. > trap. The computer suddenly freezes, cursor and all. If I press the
  3065. > interrupt key and drop into MacsBug, it tells me I'm in _PrimeTime. If I
  3066. > 'g'o, everything resumes as normal. It's like _PrimeTime just needed a
  3067. > little push.
  3068.  
  3069. This "phenomenon" has been noticed by many people with a Centris 650 and a
  3070. Power PC upgrade card (yes, I've noticed it too). Don't know what causes,
  3071. don't know how to fix it, but that "g" command does do the trick.
  3072. Irritating, if you ask me.
  3073.  
  3074. -- 
  3075. Michael Kamprath
  3076. http://www.leonardo.net/kamprath/home.html
  3077.  
  3078. ---------------------------
  3079.  
  3080. End of C.S.M.P. Digest
  3081. **********************
  3082.